1 From 1416a9b2ba710d31954131c06d46f298e340aa2c Mon Sep 17 00:00:00 2001
2 From: Heiner Kallweit <hkallweit1@gmail.com>
3 Date: Sat, 11 Jan 2025 21:50:19 +0100
4 Subject: [PATCH] net: phy: move realtek PHY driver to its own subdirectory
6 In preparation of adding a source file with hwmon support, move the
7 Realtek PHY driver to its own subdirectory and rename realtek.c to
10 Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
11 Reviewed-by: Andrew Lunn <andrew@lunn.ch>
12 Link: https://patch.msgid.link/c566551b-c915-4e34-9b33-129a6ddd6e4c@gmail.com
13 Signed-off-by: Jakub Kicinski <kuba@kernel.org>
15 drivers/net/phy/Kconfig | 5 +----
16 drivers/net/phy/Makefile | 2 +-
17 drivers/net/phy/realtek/Kconfig | 5 +++++
18 drivers/net/phy/realtek/Makefile | 3 +++
19 drivers/net/phy/{realtek.c => realtek/realtek_main.c} | 0
20 5 files changed, 10 insertions(+), 5 deletions(-)
21 create mode 100644 drivers/net/phy/realtek/Kconfig
22 create mode 100644 drivers/net/phy/realtek/Makefile
23 rename drivers/net/phy/{realtek.c => realtek/realtek_main.c} (100%)
25 --- a/drivers/net/phy/Kconfig
26 +++ b/drivers/net/phy/Kconfig
27 @@ -325,10 +325,7 @@ config QSEMI_PHY
29 Currently supports the qs6612
32 - tristate "Realtek PHYs"
34 - Supports the Realtek 821x PHY.
35 +source "drivers/net/phy/realtek/Kconfig"
38 tristate "Renesas PHYs"
39 --- a/drivers/net/phy/Makefile
40 +++ b/drivers/net/phy/Makefile
41 @@ -83,7 +83,7 @@ obj-$(CONFIG_NXP_CBTX_PHY) += nxp-cbtx.o
42 obj-$(CONFIG_NXP_TJA11XX_PHY) += nxp-tja11xx.o
44 obj-$(CONFIG_QSEMI_PHY) += qsemi.o
45 -obj-$(CONFIG_REALTEK_PHY) += realtek.o
46 +obj-$(CONFIG_REALTEK_PHY) += realtek/
47 obj-$(CONFIG_RENESAS_PHY) += uPD60620.o
48 obj-$(CONFIG_ROCKCHIP_PHY) += rockchip.o
49 obj-$(CONFIG_SMSC_PHY) += smsc.o
51 +++ b/drivers/net/phy/realtek/Kconfig
53 +# SPDX-License-Identifier: GPL-2.0-only
55 + tristate "Realtek PHYs"
57 + Currently supports RTL821x/RTL822x and fast ethernet PHYs
59 +++ b/drivers/net/phy/realtek/Makefile
61 +# SPDX-License-Identifier: GPL-2.0
62 +realtek-y += realtek_main.o
63 +obj-$(CONFIG_REALTEK_PHY) += realtek.o
64 --- a/drivers/net/phy/realtek.c
67 -// SPDX-License-Identifier: GPL-2.0+
68 -/* drivers/net/phy/realtek.c
70 - * Driver for Realtek PHYs
72 - * Author: Johnson Leung <r58129@freescale.com>
74 - * Copyright (c) 2004 Freescale Semiconductor, Inc.
76 -#include <linux/bitops.h>
77 -#include <linux/of.h>
78 -#include <linux/phy.h>
79 -#include <linux/module.h>
80 -#include <linux/delay.h>
81 -#include <linux/clk.h>
83 -#define RTL821x_PHYSR 0x11
84 -#define RTL821x_PHYSR_DUPLEX BIT(13)
85 -#define RTL821x_PHYSR_SPEED GENMASK(15, 14)
87 -#define RTL821x_INER 0x12
88 -#define RTL8211B_INER_INIT 0x6400
89 -#define RTL8211E_INER_LINK_STATUS BIT(10)
90 -#define RTL8211F_INER_LINK_STATUS BIT(4)
92 -#define RTL821x_INSR 0x13
94 -#define RTL821x_EXT_PAGE_SELECT 0x1e
95 -#define RTL821x_PAGE_SELECT 0x1f
97 -#define RTL8211F_PHYCR1 0x18
98 -#define RTL8211F_PHYCR2 0x19
99 -#define RTL8211F_INSR 0x1d
101 -#define RTL8211F_LEDCR 0x10
102 -#define RTL8211F_LEDCR_MODE BIT(15)
103 -#define RTL8211F_LEDCR_ACT_TXRX BIT(4)
104 -#define RTL8211F_LEDCR_LINK_1000 BIT(3)
105 -#define RTL8211F_LEDCR_LINK_100 BIT(1)
106 -#define RTL8211F_LEDCR_LINK_10 BIT(0)
107 -#define RTL8211F_LEDCR_MASK GENMASK(4, 0)
108 -#define RTL8211F_LEDCR_SHIFT 5
110 -#define RTL8211F_TX_DELAY BIT(8)
111 -#define RTL8211F_RX_DELAY BIT(3)
113 -#define RTL8211F_ALDPS_PLL_OFF BIT(1)
114 -#define RTL8211F_ALDPS_ENABLE BIT(2)
115 -#define RTL8211F_ALDPS_XTAL_OFF BIT(12)
117 -#define RTL8211E_CTRL_DELAY BIT(13)
118 -#define RTL8211E_TX_DELAY BIT(12)
119 -#define RTL8211E_RX_DELAY BIT(11)
121 -#define RTL8211F_CLKOUT_EN BIT(0)
123 -#define RTL8201F_ISR 0x1e
124 -#define RTL8201F_ISR_ANERR BIT(15)
125 -#define RTL8201F_ISR_DUPLEX BIT(13)
126 -#define RTL8201F_ISR_LINK BIT(11)
127 -#define RTL8201F_ISR_MASK (RTL8201F_ISR_ANERR | \
128 - RTL8201F_ISR_DUPLEX | \
130 -#define RTL8201F_IER 0x13
132 -#define RTL822X_VND1_SERDES_OPTION 0x697a
133 -#define RTL822X_VND1_SERDES_OPTION_MODE_MASK GENMASK(5, 0)
134 -#define RTL822X_VND1_SERDES_OPTION_MODE_2500BASEX_SGMII 0
135 -#define RTL822X_VND1_SERDES_OPTION_MODE_2500BASEX 2
137 -#define RTL822X_VND1_SERDES_CTRL3 0x7580
138 -#define RTL822X_VND1_SERDES_CTRL3_MODE_MASK GENMASK(5, 0)
139 -#define RTL822X_VND1_SERDES_CTRL3_MODE_SGMII 0x02
140 -#define RTL822X_VND1_SERDES_CTRL3_MODE_2500BASEX 0x16
142 -/* RTL822X_VND2_XXXXX registers are only accessible when phydev->is_c45
143 - * is set, they cannot be accessed by C45-over-C22.
145 -#define RTL822X_VND2_GBCR 0xa412
147 -#define RTL822X_VND2_GANLPAR 0xa414
149 -#define RTL8366RB_POWER_SAVE 0x15
150 -#define RTL8366RB_POWER_SAVE_ON BIT(12)
152 -#define RTL9000A_GINMR 0x14
153 -#define RTL9000A_GINMR_LINK_STATUS BIT(4)
155 -#define RTL_VND2_PHYSR 0xa434
156 -#define RTL_VND2_PHYSR_DUPLEX BIT(3)
157 -#define RTL_VND2_PHYSR_SPEEDL GENMASK(5, 4)
158 -#define RTL_VND2_PHYSR_SPEEDH GENMASK(10, 9)
159 -#define RTL_VND2_PHYSR_MASTER BIT(11)
160 -#define RTL_VND2_PHYSR_SPEED_MASK (RTL_VND2_PHYSR_SPEEDL | RTL_VND2_PHYSR_SPEEDH)
162 -#define RTL_GENERIC_PHYID 0x001cc800
163 -#define RTL_8211FVD_PHYID 0x001cc878
164 -#define RTL_8221B 0x001cc840
165 -#define RTL_8221B_VB_CG 0x001cc849
166 -#define RTL_8221B_VN_CG 0x001cc84a
167 -#define RTL_8251B 0x001cc862
169 -#define RTL8211F_LED_COUNT 3
171 -MODULE_DESCRIPTION("Realtek PHY driver");
172 -MODULE_AUTHOR("Johnson Leung");
173 -MODULE_LICENSE("GPL");
175 -struct rtl821x_priv {
182 -static int rtl821x_read_page(struct phy_device *phydev)
184 - return __phy_read(phydev, RTL821x_PAGE_SELECT);
187 -static int rtl821x_write_page(struct phy_device *phydev, int page)
189 - return __phy_write(phydev, RTL821x_PAGE_SELECT, page);
192 -static int rtl821x_probe(struct phy_device *phydev)
194 - struct device *dev = &phydev->mdio.dev;
195 - struct rtl821x_priv *priv;
196 - u32 phy_id = phydev->drv->phy_id;
199 - priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
203 - priv->clk = devm_clk_get_optional_enabled(dev, NULL);
204 - if (IS_ERR(priv->clk))
205 - return dev_err_probe(dev, PTR_ERR(priv->clk),
206 - "failed to get phy clock\n");
208 - ret = phy_read_paged(phydev, 0xa43, RTL8211F_PHYCR1);
212 - priv->phycr1 = ret & (RTL8211F_ALDPS_PLL_OFF | RTL8211F_ALDPS_ENABLE | RTL8211F_ALDPS_XTAL_OFF);
213 - if (of_property_read_bool(dev->of_node, "realtek,aldps-enable"))
214 - priv->phycr1 |= RTL8211F_ALDPS_PLL_OFF | RTL8211F_ALDPS_ENABLE | RTL8211F_ALDPS_XTAL_OFF;
216 - priv->has_phycr2 = !(phy_id == RTL_8211FVD_PHYID);
217 - if (priv->has_phycr2) {
218 - ret = phy_read_paged(phydev, 0xa43, RTL8211F_PHYCR2);
222 - priv->phycr2 = ret & RTL8211F_CLKOUT_EN;
223 - if (of_property_read_bool(dev->of_node, "realtek,clkout-disable"))
224 - priv->phycr2 &= ~RTL8211F_CLKOUT_EN;
227 - phydev->priv = priv;
232 -static int rtl8201_ack_interrupt(struct phy_device *phydev)
236 - err = phy_read(phydev, RTL8201F_ISR);
238 - return (err < 0) ? err : 0;
241 -static int rtl821x_ack_interrupt(struct phy_device *phydev)
245 - err = phy_read(phydev, RTL821x_INSR);
247 - return (err < 0) ? err : 0;
250 -static int rtl8211f_ack_interrupt(struct phy_device *phydev)
254 - err = phy_read_paged(phydev, 0xa43, RTL8211F_INSR);
256 - return (err < 0) ? err : 0;
259 -static int rtl8201_config_intr(struct phy_device *phydev)
264 - if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
265 - err = rtl8201_ack_interrupt(phydev);
269 - val = BIT(13) | BIT(12) | BIT(11);
270 - err = phy_write_paged(phydev, 0x7, RTL8201F_IER, val);
273 - err = phy_write_paged(phydev, 0x7, RTL8201F_IER, val);
277 - err = rtl8201_ack_interrupt(phydev);
283 -static int rtl8211b_config_intr(struct phy_device *phydev)
287 - if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
288 - err = rtl821x_ack_interrupt(phydev);
292 - err = phy_write(phydev, RTL821x_INER,
293 - RTL8211B_INER_INIT);
295 - err = phy_write(phydev, RTL821x_INER, 0);
299 - err = rtl821x_ack_interrupt(phydev);
305 -static int rtl8211e_config_intr(struct phy_device *phydev)
309 - if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
310 - err = rtl821x_ack_interrupt(phydev);
314 - err = phy_write(phydev, RTL821x_INER,
315 - RTL8211E_INER_LINK_STATUS);
317 - err = phy_write(phydev, RTL821x_INER, 0);
321 - err = rtl821x_ack_interrupt(phydev);
327 -static int rtl8211f_config_intr(struct phy_device *phydev)
332 - if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
333 - err = rtl8211f_ack_interrupt(phydev);
337 - val = RTL8211F_INER_LINK_STATUS;
338 - err = phy_write_paged(phydev, 0xa42, RTL821x_INER, val);
341 - err = phy_write_paged(phydev, 0xa42, RTL821x_INER, val);
345 - err = rtl8211f_ack_interrupt(phydev);
351 -static irqreturn_t rtl8201_handle_interrupt(struct phy_device *phydev)
355 - irq_status = phy_read(phydev, RTL8201F_ISR);
356 - if (irq_status < 0) {
361 - if (!(irq_status & RTL8201F_ISR_MASK))
364 - phy_trigger_machine(phydev);
366 - return IRQ_HANDLED;
369 -static irqreturn_t rtl821x_handle_interrupt(struct phy_device *phydev)
371 - int irq_status, irq_enabled;
373 - irq_status = phy_read(phydev, RTL821x_INSR);
374 - if (irq_status < 0) {
379 - irq_enabled = phy_read(phydev, RTL821x_INER);
380 - if (irq_enabled < 0) {
385 - if (!(irq_status & irq_enabled))
388 - phy_trigger_machine(phydev);
390 - return IRQ_HANDLED;
393 -static irqreturn_t rtl8211f_handle_interrupt(struct phy_device *phydev)
397 - irq_status = phy_read_paged(phydev, 0xa43, RTL8211F_INSR);
398 - if (irq_status < 0) {
403 - if (!(irq_status & RTL8211F_INER_LINK_STATUS))
406 - phy_trigger_machine(phydev);
408 - return IRQ_HANDLED;
411 -static int rtl8211_config_aneg(struct phy_device *phydev)
415 - ret = genphy_config_aneg(phydev);
419 - /* Quirk was copied from vendor driver. Unfortunately it includes no
420 - * description of the magic numbers.
422 - if (phydev->speed == SPEED_100 && phydev->autoneg == AUTONEG_DISABLE) {
423 - phy_write(phydev, 0x17, 0x2138);
424 - phy_write(phydev, 0x0e, 0x0260);
426 - phy_write(phydev, 0x17, 0x2108);
427 - phy_write(phydev, 0x0e, 0x0000);
433 -static int rtl8211c_config_init(struct phy_device *phydev)
435 - /* RTL8211C has an issue when operating in Gigabit slave mode */
436 - return phy_set_bits(phydev, MII_CTRL1000,
437 - CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER);
440 -static int rtl8211f_config_init(struct phy_device *phydev)
442 - struct rtl821x_priv *priv = phydev->priv;
443 - struct device *dev = &phydev->mdio.dev;
444 - u16 val_txdly, val_rxdly;
447 - ret = phy_modify_paged_changed(phydev, 0xa43, RTL8211F_PHYCR1,
448 - RTL8211F_ALDPS_PLL_OFF | RTL8211F_ALDPS_ENABLE | RTL8211F_ALDPS_XTAL_OFF,
451 - dev_err(dev, "aldps mode configuration failed: %pe\n",
456 - switch (phydev->interface) {
457 - case PHY_INTERFACE_MODE_RGMII:
462 - case PHY_INTERFACE_MODE_RGMII_RXID:
464 - val_rxdly = RTL8211F_RX_DELAY;
467 - case PHY_INTERFACE_MODE_RGMII_TXID:
468 - val_txdly = RTL8211F_TX_DELAY;
472 - case PHY_INTERFACE_MODE_RGMII_ID:
473 - val_txdly = RTL8211F_TX_DELAY;
474 - val_rxdly = RTL8211F_RX_DELAY;
477 - default: /* the rest of the modes imply leaving delay as is. */
481 - ret = phy_modify_paged_changed(phydev, 0xd08, 0x11, RTL8211F_TX_DELAY,
484 - dev_err(dev, "Failed to update the TX delay register\n");
488 - "%s 2ns TX delay (and changing the value from pin-strapping RXD1 or the bootloader)\n",
489 - val_txdly ? "Enabling" : "Disabling");
492 - "2ns TX delay was already %s (by pin-strapping RXD1 or bootloader configuration)\n",
493 - val_txdly ? "enabled" : "disabled");
496 - ret = phy_modify_paged_changed(phydev, 0xd08, 0x15, RTL8211F_RX_DELAY,
499 - dev_err(dev, "Failed to update the RX delay register\n");
503 - "%s 2ns RX delay (and changing the value from pin-strapping RXD0 or the bootloader)\n",
504 - val_rxdly ? "Enabling" : "Disabling");
507 - "2ns RX delay was already %s (by pin-strapping RXD0 or bootloader configuration)\n",
508 - val_rxdly ? "enabled" : "disabled");
511 - if (priv->has_phycr2) {
512 - ret = phy_modify_paged(phydev, 0xa43, RTL8211F_PHYCR2,
513 - RTL8211F_CLKOUT_EN, priv->phycr2);
515 - dev_err(dev, "clkout configuration failed: %pe\n",
520 - return genphy_soft_reset(phydev);
526 -static int rtl821x_suspend(struct phy_device *phydev)
528 - struct rtl821x_priv *priv = phydev->priv;
531 - if (!phydev->wol_enabled) {
532 - ret = genphy_suspend(phydev);
537 - clk_disable_unprepare(priv->clk);
543 -static int rtl821x_resume(struct phy_device *phydev)
545 - struct rtl821x_priv *priv = phydev->priv;
548 - if (!phydev->wol_enabled)
549 - clk_prepare_enable(priv->clk);
551 - ret = genphy_resume(phydev);
560 -static int rtl8211f_led_hw_is_supported(struct phy_device *phydev, u8 index,
561 - unsigned long rules)
563 - const unsigned long mask = BIT(TRIGGER_NETDEV_LINK_10) |
564 - BIT(TRIGGER_NETDEV_LINK_100) |
565 - BIT(TRIGGER_NETDEV_LINK_1000) |
566 - BIT(TRIGGER_NETDEV_RX) |
567 - BIT(TRIGGER_NETDEV_TX);
569 - /* The RTL8211F PHY supports these LED settings on up to three LEDs:
570 - * - Link: Configurable subset of 10/100/1000 link rates
571 - * - Active: Blink on activity, RX or TX is not differentiated
572 - * The Active option has two modes, A and B:
573 - * - A: Link and Active indication at configurable, but matching,
574 - * subset of 10/100/1000 link rates
575 - * - B: Link indication at configurable subset of 10/100/1000 link
576 - * rates and Active indication always at all three 10+100+1000
578 - * This code currently uses mode B only.
581 - if (index >= RTL8211F_LED_COUNT)
584 - /* Filter out any other unsupported triggers. */
586 - return -EOPNOTSUPP;
588 - /* RX and TX are not differentiated, either both are set or not set. */
589 - if (!(rules & BIT(TRIGGER_NETDEV_RX)) ^ !(rules & BIT(TRIGGER_NETDEV_TX)))
590 - return -EOPNOTSUPP;
595 -static int rtl8211f_led_hw_control_get(struct phy_device *phydev, u8 index,
596 - unsigned long *rules)
600 - if (index >= RTL8211F_LED_COUNT)
603 - val = phy_read_paged(phydev, 0xd04, RTL8211F_LEDCR);
607 - val >>= RTL8211F_LEDCR_SHIFT * index;
608 - val &= RTL8211F_LEDCR_MASK;
610 - if (val & RTL8211F_LEDCR_LINK_10)
611 - set_bit(TRIGGER_NETDEV_LINK_10, rules);
613 - if (val & RTL8211F_LEDCR_LINK_100)
614 - set_bit(TRIGGER_NETDEV_LINK_100, rules);
616 - if (val & RTL8211F_LEDCR_LINK_1000)
617 - set_bit(TRIGGER_NETDEV_LINK_1000, rules);
619 - if (val & RTL8211F_LEDCR_ACT_TXRX) {
620 - set_bit(TRIGGER_NETDEV_RX, rules);
621 - set_bit(TRIGGER_NETDEV_TX, rules);
627 -static int rtl8211f_led_hw_control_set(struct phy_device *phydev, u8 index,
628 - unsigned long rules)
630 - const u16 mask = RTL8211F_LEDCR_MASK << (RTL8211F_LEDCR_SHIFT * index);
633 - if (index >= RTL8211F_LED_COUNT)
636 - if (test_bit(TRIGGER_NETDEV_LINK_10, &rules))
637 - reg |= RTL8211F_LEDCR_LINK_10;
639 - if (test_bit(TRIGGER_NETDEV_LINK_100, &rules))
640 - reg |= RTL8211F_LEDCR_LINK_100;
642 - if (test_bit(TRIGGER_NETDEV_LINK_1000, &rules))
643 - reg |= RTL8211F_LEDCR_LINK_1000;
645 - if (test_bit(TRIGGER_NETDEV_RX, &rules) ||
646 - test_bit(TRIGGER_NETDEV_TX, &rules)) {
647 - reg |= RTL8211F_LEDCR_ACT_TXRX;
650 - reg <<= RTL8211F_LEDCR_SHIFT * index;
651 - reg |= RTL8211F_LEDCR_MODE; /* Mode B */
653 - return phy_modify_paged(phydev, 0xd04, RTL8211F_LEDCR, mask, reg);
656 -static int rtl8211e_config_init(struct phy_device *phydev)
658 - int ret = 0, oldpage;
661 - /* enable TX/RX delay for rgmii-* modes, and disable them for rgmii. */
662 - switch (phydev->interface) {
663 - case PHY_INTERFACE_MODE_RGMII:
664 - val = RTL8211E_CTRL_DELAY | 0;
666 - case PHY_INTERFACE_MODE_RGMII_ID:
667 - val = RTL8211E_CTRL_DELAY | RTL8211E_TX_DELAY | RTL8211E_RX_DELAY;
669 - case PHY_INTERFACE_MODE_RGMII_RXID:
670 - val = RTL8211E_CTRL_DELAY | RTL8211E_RX_DELAY;
672 - case PHY_INTERFACE_MODE_RGMII_TXID:
673 - val = RTL8211E_CTRL_DELAY | RTL8211E_TX_DELAY;
675 - default: /* the rest of the modes imply leaving delays as is. */
679 - /* According to a sample driver there is a 0x1c config register on the
680 - * 0xa4 extension page (0x7) layout. It can be used to disable/enable
681 - * the RX/TX delays otherwise controlled by RXDLY/TXDLY pins.
682 - * The configuration register definition:
684 - * 13 = Force Tx RX Delay controlled by bit12 bit11,
685 - * 12 = RX Delay, 11 = TX Delay
686 - * 10:0 = Test && debug settings reserved by realtek
688 - oldpage = phy_select_page(phydev, 0x7);
690 - goto err_restore_page;
692 - ret = __phy_write(phydev, RTL821x_EXT_PAGE_SELECT, 0xa4);
694 - goto err_restore_page;
696 - ret = __phy_modify(phydev, 0x1c, RTL8211E_CTRL_DELAY
697 - | RTL8211E_TX_DELAY | RTL8211E_RX_DELAY,
701 - return phy_restore_page(phydev, oldpage, ret);
704 -static int rtl8211b_suspend(struct phy_device *phydev)
706 - phy_write(phydev, MII_MMD_DATA, BIT(9));
708 - return genphy_suspend(phydev);
711 -static int rtl8211b_resume(struct phy_device *phydev)
713 - phy_write(phydev, MII_MMD_DATA, 0);
715 - return genphy_resume(phydev);
718 -static int rtl8366rb_config_init(struct phy_device *phydev)
722 - ret = phy_set_bits(phydev, RTL8366RB_POWER_SAVE,
723 - RTL8366RB_POWER_SAVE_ON);
725 - dev_err(&phydev->mdio.dev,
726 - "error enabling power management\n");
732 -/* get actual speed to cover the downshift case */
733 -static void rtlgen_decode_physr(struct phy_device *phydev, int val)
739 - if (val & RTL_VND2_PHYSR_DUPLEX)
740 - phydev->duplex = DUPLEX_FULL;
742 - phydev->duplex = DUPLEX_HALF;
744 - switch (val & RTL_VND2_PHYSR_SPEED_MASK) {
746 - phydev->speed = SPEED_10;
749 - phydev->speed = SPEED_100;
752 - phydev->speed = SPEED_1000;
755 - phydev->speed = SPEED_10000;
758 - phydev->speed = SPEED_2500;
761 - phydev->speed = SPEED_5000;
771 - if (phydev->speed >= 1000) {
772 - if (val & RTL_VND2_PHYSR_MASTER)
773 - phydev->master_slave_state = MASTER_SLAVE_STATE_MASTER;
775 - phydev->master_slave_state = MASTER_SLAVE_STATE_SLAVE;
777 - phydev->master_slave_state = MASTER_SLAVE_STATE_UNSUPPORTED;
781 -static int rtlgen_read_status(struct phy_device *phydev)
785 - ret = genphy_read_status(phydev);
792 - val = phy_read_paged(phydev, 0xa43, 0x12);
796 - rtlgen_decode_physr(phydev, val);
801 -static int rtlgen_read_mmd(struct phy_device *phydev, int devnum, u16 regnum)
805 - if (devnum == MDIO_MMD_VEND2) {
806 - rtl821x_write_page(phydev, regnum >> 4);
807 - ret = __phy_read(phydev, 0x10 + ((regnum & 0xf) >> 1));
808 - rtl821x_write_page(phydev, 0);
809 - } else if (devnum == MDIO_MMD_PCS && regnum == MDIO_PCS_EEE_ABLE) {
810 - rtl821x_write_page(phydev, 0xa5c);
811 - ret = __phy_read(phydev, 0x12);
812 - rtl821x_write_page(phydev, 0);
813 - } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV) {
814 - rtl821x_write_page(phydev, 0xa5d);
815 - ret = __phy_read(phydev, 0x10);
816 - rtl821x_write_page(phydev, 0);
817 - } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_LPABLE) {
818 - rtl821x_write_page(phydev, 0xa5d);
819 - ret = __phy_read(phydev, 0x11);
820 - rtl821x_write_page(phydev, 0);
828 -static int rtlgen_write_mmd(struct phy_device *phydev, int devnum, u16 regnum,
833 - if (devnum == MDIO_MMD_VEND2) {
834 - rtl821x_write_page(phydev, regnum >> 4);
835 - ret = __phy_write(phydev, 0x10 + ((regnum & 0xf) >> 1), val);
836 - rtl821x_write_page(phydev, 0);
837 - } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV) {
838 - rtl821x_write_page(phydev, 0xa5d);
839 - ret = __phy_write(phydev, 0x10, val);
840 - rtl821x_write_page(phydev, 0);
848 -static int rtl822x_read_mmd(struct phy_device *phydev, int devnum, u16 regnum)
850 - int ret = rtlgen_read_mmd(phydev, devnum, regnum);
852 - if (ret != -EOPNOTSUPP)
855 - if (devnum == MDIO_MMD_PCS && regnum == MDIO_PCS_EEE_ABLE2) {
856 - rtl821x_write_page(phydev, 0xa6e);
857 - ret = __phy_read(phydev, 0x16);
858 - rtl821x_write_page(phydev, 0);
859 - } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV2) {
860 - rtl821x_write_page(phydev, 0xa6d);
861 - ret = __phy_read(phydev, 0x12);
862 - rtl821x_write_page(phydev, 0);
863 - } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_LPABLE2) {
864 - rtl821x_write_page(phydev, 0xa6d);
865 - ret = __phy_read(phydev, 0x10);
866 - rtl821x_write_page(phydev, 0);
872 -static int rtl822x_write_mmd(struct phy_device *phydev, int devnum, u16 regnum,
875 - int ret = rtlgen_write_mmd(phydev, devnum, regnum, val);
877 - if (ret != -EOPNOTSUPP)
880 - if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV2) {
881 - rtl821x_write_page(phydev, 0xa6d);
882 - ret = __phy_write(phydev, 0x12, val);
883 - rtl821x_write_page(phydev, 0);
889 -static int rtl822xb_config_init(struct phy_device *phydev)
891 - bool has_2500, has_sgmii;
895 - has_2500 = test_bit(PHY_INTERFACE_MODE_2500BASEX,
896 - phydev->host_interfaces) ||
897 - phydev->interface == PHY_INTERFACE_MODE_2500BASEX;
899 - has_sgmii = test_bit(PHY_INTERFACE_MODE_SGMII,
900 - phydev->host_interfaces) ||
901 - phydev->interface == PHY_INTERFACE_MODE_SGMII;
903 - /* fill in possible interfaces */
904 - __assign_bit(PHY_INTERFACE_MODE_2500BASEX, phydev->possible_interfaces,
906 - __assign_bit(PHY_INTERFACE_MODE_SGMII, phydev->possible_interfaces,
909 - if (!has_2500 && !has_sgmii)
912 - /* determine SerDes option mode */
913 - if (has_2500 && !has_sgmii) {
914 - mode = RTL822X_VND1_SERDES_OPTION_MODE_2500BASEX;
915 - phydev->rate_matching = RATE_MATCH_PAUSE;
917 - mode = RTL822X_VND1_SERDES_OPTION_MODE_2500BASEX_SGMII;
918 - phydev->rate_matching = RATE_MATCH_NONE;
921 - /* the following sequence with magic numbers sets up the SerDes
924 - ret = phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x75f3, 0);
928 - ret = phy_modify_mmd_changed(phydev, MDIO_MMD_VEND1,
929 - RTL822X_VND1_SERDES_OPTION,
930 - RTL822X_VND1_SERDES_OPTION_MODE_MASK,
935 - ret = phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x6a04, 0x0503);
939 - ret = phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x6f10, 0xd455);
943 - return phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x6f11, 0x8020);
946 -static int rtl822xb_get_rate_matching(struct phy_device *phydev,
947 - phy_interface_t iface)
951 - /* Only rate matching at 2500base-x */
952 - if (iface != PHY_INTERFACE_MODE_2500BASEX)
953 - return RATE_MATCH_NONE;
955 - val = phy_read_mmd(phydev, MDIO_MMD_VEND1, RTL822X_VND1_SERDES_OPTION);
959 - if ((val & RTL822X_VND1_SERDES_OPTION_MODE_MASK) ==
960 - RTL822X_VND1_SERDES_OPTION_MODE_2500BASEX)
961 - return RATE_MATCH_PAUSE;
963 - /* RTL822X_VND1_SERDES_OPTION_MODE_2500BASEX_SGMII */
964 - return RATE_MATCH_NONE;
967 -static int rtl822x_get_features(struct phy_device *phydev)
971 - val = phy_read_paged(phydev, 0xa61, 0x13);
975 - linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
976 - phydev->supported, val & MDIO_PMA_SPEED_2_5G);
977 - linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
978 - phydev->supported, val & MDIO_PMA_SPEED_5G);
979 - linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
980 - phydev->supported, val & MDIO_SPEED_10G);
982 - return genphy_read_abilities(phydev);
985 -static int rtl822x_config_aneg(struct phy_device *phydev)
989 - if (phydev->autoneg == AUTONEG_ENABLE) {
990 - u16 adv = linkmode_adv_to_mii_10gbt_adv_t(phydev->advertising);
992 - ret = phy_modify_paged_changed(phydev, 0xa5d, 0x12,
993 - MDIO_AN_10GBT_CTRL_ADV2_5G |
994 - MDIO_AN_10GBT_CTRL_ADV5G,
1000 - return __genphy_config_aneg(phydev, ret);
1003 -static void rtl822xb_update_interface(struct phy_device *phydev)
1007 - if (!phydev->link)
1010 - /* Change interface according to serdes mode */
1011 - val = phy_read_mmd(phydev, MDIO_MMD_VEND1, RTL822X_VND1_SERDES_CTRL3);
1015 - switch (val & RTL822X_VND1_SERDES_CTRL3_MODE_MASK) {
1016 - case RTL822X_VND1_SERDES_CTRL3_MODE_2500BASEX:
1017 - phydev->interface = PHY_INTERFACE_MODE_2500BASEX;
1019 - case RTL822X_VND1_SERDES_CTRL3_MODE_SGMII:
1020 - phydev->interface = PHY_INTERFACE_MODE_SGMII;
1025 -static int rtl822x_read_status(struct phy_device *phydev)
1029 - mii_10gbt_stat_mod_linkmode_lpa_t(phydev->lp_advertising, 0);
1031 - ret = rtlgen_read_status(phydev);
1035 - if (phydev->autoneg == AUTONEG_DISABLE ||
1036 - !phydev->autoneg_complete)
1039 - lpadv = phy_read_paged(phydev, 0xa5d, 0x13);
1043 - mii_10gbt_stat_mod_linkmode_lpa_t(phydev->lp_advertising, lpadv);
1048 -static int rtl822xb_read_status(struct phy_device *phydev)
1052 - ret = rtl822x_read_status(phydev);
1056 - rtl822xb_update_interface(phydev);
1061 -static int rtl822x_c45_get_features(struct phy_device *phydev)
1063 - linkmode_set_bit(ETHTOOL_LINK_MODE_TP_BIT,
1064 - phydev->supported);
1066 - return genphy_c45_pma_read_abilities(phydev);
1069 -static int rtl822x_c45_config_aneg(struct phy_device *phydev)
1071 - bool changed = false;
1074 - if (phydev->autoneg == AUTONEG_DISABLE)
1075 - return genphy_c45_pma_setup_forced(phydev);
1077 - ret = genphy_c45_an_config_aneg(phydev);
1083 - val = linkmode_adv_to_mii_ctrl1000_t(phydev->advertising);
1085 - /* Vendor register as C45 has no standardized support for 1000BaseT */
1086 - ret = phy_modify_mmd_changed(phydev, MDIO_MMD_VEND2, RTL822X_VND2_GBCR,
1087 - ADVERTISE_1000FULL, val);
1093 - return genphy_c45_check_and_restart_aneg(phydev, changed);
1096 -static int rtl822x_c45_read_status(struct phy_device *phydev)
1100 - /* Vendor register as C45 has no standardized support for 1000BaseT */
1101 - if (phydev->autoneg == AUTONEG_ENABLE && genphy_c45_aneg_done(phydev)) {
1102 - val = phy_read_mmd(phydev, MDIO_MMD_VEND2,
1103 - RTL822X_VND2_GANLPAR);
1109 - mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, val);
1111 - ret = genphy_c45_read_status(phydev);
1115 - if (!phydev->link) {
1116 - phydev->master_slave_state = MASTER_SLAVE_STATE_UNKNOWN;
1120 - /* Read actual speed from vendor register. */
1121 - val = phy_read_mmd(phydev, MDIO_MMD_VEND2, RTL_VND2_PHYSR);
1125 - rtlgen_decode_physr(phydev, val);
1130 -static int rtl822xb_c45_read_status(struct phy_device *phydev)
1134 - ret = rtl822x_c45_read_status(phydev);
1138 - rtl822xb_update_interface(phydev);
1143 -static bool rtlgen_supports_2_5gbps(struct phy_device *phydev)
1147 - phy_write(phydev, RTL821x_PAGE_SELECT, 0xa61);
1148 - val = phy_read(phydev, 0x13);
1149 - phy_write(phydev, RTL821x_PAGE_SELECT, 0);
1151 - return val >= 0 && val & MDIO_PMA_SPEED_2_5G;
1154 -/* On internal PHY's MMD reads over C22 always return 0.
1155 - * Check a MMD register which is known to be non-zero.
1157 -static bool rtlgen_supports_mmd(struct phy_device *phydev)
1161 - phy_lock_mdio_bus(phydev);
1162 - __phy_write(phydev, MII_MMD_CTRL, MDIO_MMD_PCS);
1163 - __phy_write(phydev, MII_MMD_DATA, MDIO_PCS_EEE_ABLE);
1164 - __phy_write(phydev, MII_MMD_CTRL, MDIO_MMD_PCS | MII_MMD_CTRL_NOINCR);
1165 - val = __phy_read(phydev, MII_MMD_DATA);
1166 - phy_unlock_mdio_bus(phydev);
1171 -static int rtlgen_match_phy_device(struct phy_device *phydev)
1173 - return phydev->phy_id == RTL_GENERIC_PHYID &&
1174 - !rtlgen_supports_2_5gbps(phydev);
1177 -static int rtl8226_match_phy_device(struct phy_device *phydev)
1179 - return phydev->phy_id == RTL_GENERIC_PHYID &&
1180 - rtlgen_supports_2_5gbps(phydev) &&
1181 - rtlgen_supports_mmd(phydev);
1184 -static int rtlgen_is_c45_match(struct phy_device *phydev, unsigned int id,
1187 - if (phydev->is_c45)
1188 - return is_c45 && (id == phydev->c45_ids.device_ids[1]);
1190 - return !is_c45 && (id == phydev->phy_id);
1193 -static int rtl8221b_match_phy_device(struct phy_device *phydev)
1195 - return phydev->phy_id == RTL_8221B && rtlgen_supports_mmd(phydev);
1198 -static int rtl8221b_vb_cg_c22_match_phy_device(struct phy_device *phydev)
1200 - return rtlgen_is_c45_match(phydev, RTL_8221B_VB_CG, false);
1203 -static int rtl8221b_vb_cg_c45_match_phy_device(struct phy_device *phydev)
1205 - return rtlgen_is_c45_match(phydev, RTL_8221B_VB_CG, true);
1208 -static int rtl8221b_vn_cg_c22_match_phy_device(struct phy_device *phydev)
1210 - return rtlgen_is_c45_match(phydev, RTL_8221B_VN_CG, false);
1213 -static int rtl8221b_vn_cg_c45_match_phy_device(struct phy_device *phydev)
1215 - return rtlgen_is_c45_match(phydev, RTL_8221B_VN_CG, true);
1218 -static int rtl_internal_nbaset_match_phy_device(struct phy_device *phydev)
1220 - if (phydev->is_c45)
1223 - switch (phydev->phy_id) {
1224 - case RTL_GENERIC_PHYID:
1233 - return rtlgen_supports_2_5gbps(phydev) && !rtlgen_supports_mmd(phydev);
1236 -static int rtl8251b_c45_match_phy_device(struct phy_device *phydev)
1238 - return rtlgen_is_c45_match(phydev, RTL_8251B, true);
1241 -static int rtlgen_resume(struct phy_device *phydev)
1243 - int ret = genphy_resume(phydev);
1245 - /* Internal PHY's from RTL8168h up may not be instantly ready */
1251 -static int rtlgen_c45_resume(struct phy_device *phydev)
1253 - int ret = genphy_c45_pma_resume(phydev);
1260 -static int rtl9000a_config_init(struct phy_device *phydev)
1262 - phydev->autoneg = AUTONEG_DISABLE;
1263 - phydev->speed = SPEED_100;
1264 - phydev->duplex = DUPLEX_FULL;
1269 -static int rtl9000a_config_aneg(struct phy_device *phydev)
1274 - switch (phydev->master_slave_set) {
1275 - case MASTER_SLAVE_CFG_MASTER_FORCE:
1276 - ctl |= CTL1000_AS_MASTER;
1278 - case MASTER_SLAVE_CFG_SLAVE_FORCE:
1280 - case MASTER_SLAVE_CFG_UNKNOWN:
1281 - case MASTER_SLAVE_CFG_UNSUPPORTED:
1284 - phydev_warn(phydev, "Unsupported Master/Slave mode\n");
1285 - return -EOPNOTSUPP;
1288 - ret = phy_modify_changed(phydev, MII_CTRL1000, CTL1000_AS_MASTER, ctl);
1290 - ret = genphy_soft_reset(phydev);
1295 -static int rtl9000a_read_status(struct phy_device *phydev)
1299 - phydev->master_slave_get = MASTER_SLAVE_CFG_UNKNOWN;
1300 - phydev->master_slave_state = MASTER_SLAVE_STATE_UNKNOWN;
1302 - ret = genphy_update_link(phydev);
1306 - ret = phy_read(phydev, MII_CTRL1000);
1309 - if (ret & CTL1000_AS_MASTER)
1310 - phydev->master_slave_get = MASTER_SLAVE_CFG_MASTER_FORCE;
1312 - phydev->master_slave_get = MASTER_SLAVE_CFG_SLAVE_FORCE;
1314 - ret = phy_read(phydev, MII_STAT1000);
1317 - if (ret & LPA_1000MSRES)
1318 - phydev->master_slave_state = MASTER_SLAVE_STATE_MASTER;
1320 - phydev->master_slave_state = MASTER_SLAVE_STATE_SLAVE;
1325 -static int rtl9000a_ack_interrupt(struct phy_device *phydev)
1329 - err = phy_read(phydev, RTL8211F_INSR);
1331 - return (err < 0) ? err : 0;
1334 -static int rtl9000a_config_intr(struct phy_device *phydev)
1339 - if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
1340 - err = rtl9000a_ack_interrupt(phydev);
1344 - val = (u16)~RTL9000A_GINMR_LINK_STATUS;
1345 - err = phy_write_paged(phydev, 0xa42, RTL9000A_GINMR, val);
1348 - err = phy_write_paged(phydev, 0xa42, RTL9000A_GINMR, val);
1352 - err = rtl9000a_ack_interrupt(phydev);
1355 - return phy_write_paged(phydev, 0xa42, RTL9000A_GINMR, val);
1358 -static irqreturn_t rtl9000a_handle_interrupt(struct phy_device *phydev)
1362 - irq_status = phy_read(phydev, RTL8211F_INSR);
1363 - if (irq_status < 0) {
1364 - phy_error(phydev);
1368 - if (!(irq_status & RTL8211F_INER_LINK_STATUS))
1371 - phy_trigger_machine(phydev);
1373 - return IRQ_HANDLED;
1376 -static struct phy_driver realtek_drvs[] = {
1378 - PHY_ID_MATCH_EXACT(0x00008201),
1379 - .name = "RTL8201CP Ethernet",
1380 - .read_page = rtl821x_read_page,
1381 - .write_page = rtl821x_write_page,
1383 - PHY_ID_MATCH_EXACT(0x001cc816),
1384 - .name = "RTL8201F Fast Ethernet",
1385 - .config_intr = &rtl8201_config_intr,
1386 - .handle_interrupt = rtl8201_handle_interrupt,
1387 - .suspend = genphy_suspend,
1388 - .resume = genphy_resume,
1389 - .read_page = rtl821x_read_page,
1390 - .write_page = rtl821x_write_page,
1392 - PHY_ID_MATCH_MODEL(0x001cc880),
1393 - .name = "RTL8208 Fast Ethernet",
1394 - .read_mmd = genphy_read_mmd_unsupported,
1395 - .write_mmd = genphy_write_mmd_unsupported,
1396 - .suspend = genphy_suspend,
1397 - .resume = genphy_resume,
1398 - .read_page = rtl821x_read_page,
1399 - .write_page = rtl821x_write_page,
1401 - PHY_ID_MATCH_EXACT(0x001cc910),
1402 - .name = "RTL8211 Gigabit Ethernet",
1403 - .config_aneg = rtl8211_config_aneg,
1404 - .read_mmd = &genphy_read_mmd_unsupported,
1405 - .write_mmd = &genphy_write_mmd_unsupported,
1406 - .read_page = rtl821x_read_page,
1407 - .write_page = rtl821x_write_page,
1409 - PHY_ID_MATCH_EXACT(0x001cc912),
1410 - .name = "RTL8211B Gigabit Ethernet",
1411 - .config_intr = &rtl8211b_config_intr,
1412 - .handle_interrupt = rtl821x_handle_interrupt,
1413 - .read_mmd = &genphy_read_mmd_unsupported,
1414 - .write_mmd = &genphy_write_mmd_unsupported,
1415 - .suspend = rtl8211b_suspend,
1416 - .resume = rtl8211b_resume,
1417 - .read_page = rtl821x_read_page,
1418 - .write_page = rtl821x_write_page,
1420 - PHY_ID_MATCH_EXACT(0x001cc913),
1421 - .name = "RTL8211C Gigabit Ethernet",
1422 - .config_init = rtl8211c_config_init,
1423 - .read_mmd = &genphy_read_mmd_unsupported,
1424 - .write_mmd = &genphy_write_mmd_unsupported,
1425 - .read_page = rtl821x_read_page,
1426 - .write_page = rtl821x_write_page,
1428 - PHY_ID_MATCH_EXACT(0x001cc914),
1429 - .name = "RTL8211DN Gigabit Ethernet",
1430 - .config_intr = rtl8211e_config_intr,
1431 - .handle_interrupt = rtl821x_handle_interrupt,
1432 - .suspend = genphy_suspend,
1433 - .resume = genphy_resume,
1434 - .read_page = rtl821x_read_page,
1435 - .write_page = rtl821x_write_page,
1437 - PHY_ID_MATCH_EXACT(0x001cc915),
1438 - .name = "RTL8211E Gigabit Ethernet",
1439 - .config_init = &rtl8211e_config_init,
1440 - .config_intr = &rtl8211e_config_intr,
1441 - .handle_interrupt = rtl821x_handle_interrupt,
1442 - .suspend = genphy_suspend,
1443 - .resume = genphy_resume,
1444 - .read_page = rtl821x_read_page,
1445 - .write_page = rtl821x_write_page,
1447 - PHY_ID_MATCH_EXACT(0x001cc916),
1448 - .name = "RTL8211F Gigabit Ethernet",
1449 - .probe = rtl821x_probe,
1450 - .config_init = &rtl8211f_config_init,
1451 - .read_status = rtlgen_read_status,
1452 - .config_intr = &rtl8211f_config_intr,
1453 - .handle_interrupt = rtl8211f_handle_interrupt,
1454 - .suspend = rtl821x_suspend,
1455 - .resume = rtl821x_resume,
1456 - .read_page = rtl821x_read_page,
1457 - .write_page = rtl821x_write_page,
1458 - .flags = PHY_ALWAYS_CALL_SUSPEND,
1459 - .led_hw_is_supported = rtl8211f_led_hw_is_supported,
1460 - .led_hw_control_get = rtl8211f_led_hw_control_get,
1461 - .led_hw_control_set = rtl8211f_led_hw_control_set,
1463 - PHY_ID_MATCH_EXACT(RTL_8211FVD_PHYID),
1464 - .name = "RTL8211F-VD Gigabit Ethernet",
1465 - .probe = rtl821x_probe,
1466 - .config_init = &rtl8211f_config_init,
1467 - .read_status = rtlgen_read_status,
1468 - .config_intr = &rtl8211f_config_intr,
1469 - .handle_interrupt = rtl8211f_handle_interrupt,
1470 - .suspend = rtl821x_suspend,
1471 - .resume = rtl821x_resume,
1472 - .read_page = rtl821x_read_page,
1473 - .write_page = rtl821x_write_page,
1474 - .flags = PHY_ALWAYS_CALL_SUSPEND,
1476 - .name = "Generic FE-GE Realtek PHY",
1477 - .match_phy_device = rtlgen_match_phy_device,
1478 - .read_status = rtlgen_read_status,
1479 - .suspend = genphy_suspend,
1480 - .resume = rtlgen_resume,
1481 - .read_page = rtl821x_read_page,
1482 - .write_page = rtl821x_write_page,
1483 - .read_mmd = rtlgen_read_mmd,
1484 - .write_mmd = rtlgen_write_mmd,
1486 - .name = "RTL8226 2.5Gbps PHY",
1487 - .match_phy_device = rtl8226_match_phy_device,
1488 - .get_features = rtl822x_get_features,
1489 - .config_aneg = rtl822x_config_aneg,
1490 - .read_status = rtl822x_read_status,
1491 - .suspend = genphy_suspend,
1492 - .resume = rtlgen_resume,
1493 - .read_page = rtl821x_read_page,
1494 - .write_page = rtl821x_write_page,
1496 - .match_phy_device = rtl8221b_match_phy_device,
1497 - .name = "RTL8226B_RTL8221B 2.5Gbps PHY",
1498 - .get_features = rtl822x_get_features,
1499 - .config_aneg = rtl822x_config_aneg,
1500 - .config_init = rtl822xb_config_init,
1501 - .get_rate_matching = rtl822xb_get_rate_matching,
1502 - .read_status = rtl822xb_read_status,
1503 - .suspend = genphy_suspend,
1504 - .resume = rtlgen_resume,
1505 - .read_page = rtl821x_read_page,
1506 - .write_page = rtl821x_write_page,
1508 - PHY_ID_MATCH_EXACT(0x001cc838),
1509 - .name = "RTL8226-CG 2.5Gbps PHY",
1510 - .get_features = rtl822x_get_features,
1511 - .config_aneg = rtl822x_config_aneg,
1512 - .read_status = rtl822x_read_status,
1513 - .suspend = genphy_suspend,
1514 - .resume = rtlgen_resume,
1515 - .read_page = rtl821x_read_page,
1516 - .write_page = rtl821x_write_page,
1518 - PHY_ID_MATCH_EXACT(0x001cc848),
1519 - .name = "RTL8226B-CG_RTL8221B-CG 2.5Gbps PHY",
1520 - .get_features = rtl822x_get_features,
1521 - .config_aneg = rtl822x_config_aneg,
1522 - .config_init = rtl822xb_config_init,
1523 - .get_rate_matching = rtl822xb_get_rate_matching,
1524 - .read_status = rtl822xb_read_status,
1525 - .suspend = genphy_suspend,
1526 - .resume = rtlgen_resume,
1527 - .read_page = rtl821x_read_page,
1528 - .write_page = rtl821x_write_page,
1530 - .match_phy_device = rtl8221b_vb_cg_c22_match_phy_device,
1531 - .name = "RTL8221B-VB-CG 2.5Gbps PHY (C22)",
1532 - .get_features = rtl822x_get_features,
1533 - .config_aneg = rtl822x_config_aneg,
1534 - .config_init = rtl822xb_config_init,
1535 - .get_rate_matching = rtl822xb_get_rate_matching,
1536 - .read_status = rtl822xb_read_status,
1537 - .suspend = genphy_suspend,
1538 - .resume = rtlgen_resume,
1539 - .read_page = rtl821x_read_page,
1540 - .write_page = rtl821x_write_page,
1542 - .match_phy_device = rtl8221b_vb_cg_c45_match_phy_device,
1543 - .name = "RTL8221B-VB-CG 2.5Gbps PHY (C45)",
1544 - .config_init = rtl822xb_config_init,
1545 - .get_rate_matching = rtl822xb_get_rate_matching,
1546 - .get_features = rtl822x_c45_get_features,
1547 - .config_aneg = rtl822x_c45_config_aneg,
1548 - .read_status = rtl822xb_c45_read_status,
1549 - .suspend = genphy_c45_pma_suspend,
1550 - .resume = rtlgen_c45_resume,
1552 - .match_phy_device = rtl8221b_vn_cg_c22_match_phy_device,
1553 - .name = "RTL8221B-VM-CG 2.5Gbps PHY (C22)",
1554 - .get_features = rtl822x_get_features,
1555 - .config_aneg = rtl822x_config_aneg,
1556 - .config_init = rtl822xb_config_init,
1557 - .get_rate_matching = rtl822xb_get_rate_matching,
1558 - .read_status = rtl822xb_read_status,
1559 - .suspend = genphy_suspend,
1560 - .resume = rtlgen_resume,
1561 - .read_page = rtl821x_read_page,
1562 - .write_page = rtl821x_write_page,
1564 - .match_phy_device = rtl8221b_vn_cg_c45_match_phy_device,
1565 - .name = "RTL8221B-VN-CG 2.5Gbps PHY (C45)",
1566 - .config_init = rtl822xb_config_init,
1567 - .get_rate_matching = rtl822xb_get_rate_matching,
1568 - .get_features = rtl822x_c45_get_features,
1569 - .config_aneg = rtl822x_c45_config_aneg,
1570 - .read_status = rtl822xb_c45_read_status,
1571 - .suspend = genphy_c45_pma_suspend,
1572 - .resume = rtlgen_c45_resume,
1574 - .match_phy_device = rtl8251b_c45_match_phy_device,
1575 - .name = "RTL8251B 5Gbps PHY",
1576 - .get_features = rtl822x_get_features,
1577 - .config_aneg = rtl822x_config_aneg,
1578 - .read_status = rtl822x_read_status,
1579 - .suspend = genphy_suspend,
1580 - .resume = rtlgen_resume,
1581 - .read_page = rtl821x_read_page,
1582 - .write_page = rtl821x_write_page,
1584 - .match_phy_device = rtl_internal_nbaset_match_phy_device,
1585 - .name = "Realtek Internal NBASE-T PHY",
1586 - .flags = PHY_IS_INTERNAL,
1587 - .get_features = rtl822x_get_features,
1588 - .config_aneg = rtl822x_config_aneg,
1589 - .read_status = rtl822x_read_status,
1590 - .suspend = genphy_suspend,
1591 - .resume = rtlgen_resume,
1592 - .read_page = rtl821x_read_page,
1593 - .write_page = rtl821x_write_page,
1594 - .read_mmd = rtl822x_read_mmd,
1595 - .write_mmd = rtl822x_write_mmd,
1597 - PHY_ID_MATCH_EXACT(0x001ccad0),
1598 - .name = "RTL8224 2.5Gbps PHY",
1599 - .get_features = rtl822x_c45_get_features,
1600 - .config_aneg = rtl822x_c45_config_aneg,
1601 - .read_status = rtl822x_c45_read_status,
1602 - .suspend = genphy_c45_pma_suspend,
1603 - .resume = rtlgen_c45_resume,
1605 - PHY_ID_MATCH_EXACT(0x001cc961),
1606 - .name = "RTL8366RB Gigabit Ethernet",
1607 - .config_init = &rtl8366rb_config_init,
1608 - /* These interrupts are handled by the irq controller
1609 - * embedded inside the RTL8366RB, they get unmasked when the
1610 - * irq is requested and ACKed by reading the status register,
1611 - * which is done by the irqchip code.
1613 - .config_intr = genphy_no_config_intr,
1614 - .handle_interrupt = genphy_handle_interrupt_no_ack,
1615 - .suspend = genphy_suspend,
1616 - .resume = genphy_resume,
1618 - PHY_ID_MATCH_EXACT(0x001ccb00),
1619 - .name = "RTL9000AA_RTL9000AN Ethernet",
1620 - .features = PHY_BASIC_T1_FEATURES,
1621 - .config_init = rtl9000a_config_init,
1622 - .config_aneg = rtl9000a_config_aneg,
1623 - .read_status = rtl9000a_read_status,
1624 - .config_intr = rtl9000a_config_intr,
1625 - .handle_interrupt = rtl9000a_handle_interrupt,
1626 - .suspend = genphy_suspend,
1627 - .resume = genphy_resume,
1628 - .read_page = rtl821x_read_page,
1629 - .write_page = rtl821x_write_page,
1631 - PHY_ID_MATCH_EXACT(0x001cc942),
1632 - .name = "RTL8365MB-VC Gigabit Ethernet",
1633 - /* Interrupt handling analogous to RTL8366RB */
1634 - .config_intr = genphy_no_config_intr,
1635 - .handle_interrupt = genphy_handle_interrupt_no_ack,
1636 - .suspend = genphy_suspend,
1637 - .resume = genphy_resume,
1639 - PHY_ID_MATCH_EXACT(0x001cc960),
1640 - .name = "RTL8366S Gigabit Ethernet",
1641 - .suspend = genphy_suspend,
1642 - .resume = genphy_resume,
1643 - .read_mmd = genphy_read_mmd_unsupported,
1644 - .write_mmd = genphy_write_mmd_unsupported,
1648 -module_phy_driver(realtek_drvs);
1650 -static const struct mdio_device_id __maybe_unused realtek_tbl[] = {
1651 - { PHY_ID_MATCH_VENDOR(0x001cc800) },
1655 -MODULE_DEVICE_TABLE(mdio, realtek_tbl);
1657 +++ b/drivers/net/phy/realtek/realtek_main.c
1659 +// SPDX-License-Identifier: GPL-2.0+
1660 +/* drivers/net/phy/realtek.c
1662 + * Driver for Realtek PHYs
1664 + * Author: Johnson Leung <r58129@freescale.com>
1666 + * Copyright (c) 2004 Freescale Semiconductor, Inc.
1668 +#include <linux/bitops.h>
1669 +#include <linux/of.h>
1670 +#include <linux/phy.h>
1671 +#include <linux/module.h>
1672 +#include <linux/delay.h>
1673 +#include <linux/clk.h>
1675 +#define RTL821x_PHYSR 0x11
1676 +#define RTL821x_PHYSR_DUPLEX BIT(13)
1677 +#define RTL821x_PHYSR_SPEED GENMASK(15, 14)
1679 +#define RTL821x_INER 0x12
1680 +#define RTL8211B_INER_INIT 0x6400
1681 +#define RTL8211E_INER_LINK_STATUS BIT(10)
1682 +#define RTL8211F_INER_LINK_STATUS BIT(4)
1684 +#define RTL821x_INSR 0x13
1686 +#define RTL821x_EXT_PAGE_SELECT 0x1e
1687 +#define RTL821x_PAGE_SELECT 0x1f
1689 +#define RTL8211F_PHYCR1 0x18
1690 +#define RTL8211F_PHYCR2 0x19
1691 +#define RTL8211F_INSR 0x1d
1693 +#define RTL8211F_LEDCR 0x10
1694 +#define RTL8211F_LEDCR_MODE BIT(15)
1695 +#define RTL8211F_LEDCR_ACT_TXRX BIT(4)
1696 +#define RTL8211F_LEDCR_LINK_1000 BIT(3)
1697 +#define RTL8211F_LEDCR_LINK_100 BIT(1)
1698 +#define RTL8211F_LEDCR_LINK_10 BIT(0)
1699 +#define RTL8211F_LEDCR_MASK GENMASK(4, 0)
1700 +#define RTL8211F_LEDCR_SHIFT 5
1702 +#define RTL8211F_TX_DELAY BIT(8)
1703 +#define RTL8211F_RX_DELAY BIT(3)
1705 +#define RTL8211F_ALDPS_PLL_OFF BIT(1)
1706 +#define RTL8211F_ALDPS_ENABLE BIT(2)
1707 +#define RTL8211F_ALDPS_XTAL_OFF BIT(12)
1709 +#define RTL8211E_CTRL_DELAY BIT(13)
1710 +#define RTL8211E_TX_DELAY BIT(12)
1711 +#define RTL8211E_RX_DELAY BIT(11)
1713 +#define RTL8211F_CLKOUT_EN BIT(0)
1715 +#define RTL8201F_ISR 0x1e
1716 +#define RTL8201F_ISR_ANERR BIT(15)
1717 +#define RTL8201F_ISR_DUPLEX BIT(13)
1718 +#define RTL8201F_ISR_LINK BIT(11)
1719 +#define RTL8201F_ISR_MASK (RTL8201F_ISR_ANERR | \
1720 + RTL8201F_ISR_DUPLEX | \
1721 + RTL8201F_ISR_LINK)
1722 +#define RTL8201F_IER 0x13
1724 +#define RTL822X_VND1_SERDES_OPTION 0x697a
1725 +#define RTL822X_VND1_SERDES_OPTION_MODE_MASK GENMASK(5, 0)
1726 +#define RTL822X_VND1_SERDES_OPTION_MODE_2500BASEX_SGMII 0
1727 +#define RTL822X_VND1_SERDES_OPTION_MODE_2500BASEX 2
1729 +#define RTL822X_VND1_SERDES_CTRL3 0x7580
1730 +#define RTL822X_VND1_SERDES_CTRL3_MODE_MASK GENMASK(5, 0)
1731 +#define RTL822X_VND1_SERDES_CTRL3_MODE_SGMII 0x02
1732 +#define RTL822X_VND1_SERDES_CTRL3_MODE_2500BASEX 0x16
1734 +/* RTL822X_VND2_XXXXX registers are only accessible when phydev->is_c45
1735 + * is set, they cannot be accessed by C45-over-C22.
1737 +#define RTL822X_VND2_GBCR 0xa412
1739 +#define RTL822X_VND2_GANLPAR 0xa414
1741 +#define RTL8366RB_POWER_SAVE 0x15
1742 +#define RTL8366RB_POWER_SAVE_ON BIT(12)
1744 +#define RTL9000A_GINMR 0x14
1745 +#define RTL9000A_GINMR_LINK_STATUS BIT(4)
1747 +#define RTL_VND2_PHYSR 0xa434
1748 +#define RTL_VND2_PHYSR_DUPLEX BIT(3)
1749 +#define RTL_VND2_PHYSR_SPEEDL GENMASK(5, 4)
1750 +#define RTL_VND2_PHYSR_SPEEDH GENMASK(10, 9)
1751 +#define RTL_VND2_PHYSR_MASTER BIT(11)
1752 +#define RTL_VND2_PHYSR_SPEED_MASK (RTL_VND2_PHYSR_SPEEDL | RTL_VND2_PHYSR_SPEEDH)
1754 +#define RTL_GENERIC_PHYID 0x001cc800
1755 +#define RTL_8211FVD_PHYID 0x001cc878
1756 +#define RTL_8221B 0x001cc840
1757 +#define RTL_8221B_VB_CG 0x001cc849
1758 +#define RTL_8221B_VN_CG 0x001cc84a
1759 +#define RTL_8251B 0x001cc862
1761 +#define RTL8211F_LED_COUNT 3
1763 +MODULE_DESCRIPTION("Realtek PHY driver");
1764 +MODULE_AUTHOR("Johnson Leung");
1765 +MODULE_LICENSE("GPL");
1767 +struct rtl821x_priv {
1774 +static int rtl821x_read_page(struct phy_device *phydev)
1776 + return __phy_read(phydev, RTL821x_PAGE_SELECT);
1779 +static int rtl821x_write_page(struct phy_device *phydev, int page)
1781 + return __phy_write(phydev, RTL821x_PAGE_SELECT, page);
1784 +static int rtl821x_probe(struct phy_device *phydev)
1786 + struct device *dev = &phydev->mdio.dev;
1787 + struct rtl821x_priv *priv;
1788 + u32 phy_id = phydev->drv->phy_id;
1791 + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
1795 + priv->clk = devm_clk_get_optional_enabled(dev, NULL);
1796 + if (IS_ERR(priv->clk))
1797 + return dev_err_probe(dev, PTR_ERR(priv->clk),
1798 + "failed to get phy clock\n");
1800 + ret = phy_read_paged(phydev, 0xa43, RTL8211F_PHYCR1);
1804 + priv->phycr1 = ret & (RTL8211F_ALDPS_PLL_OFF | RTL8211F_ALDPS_ENABLE | RTL8211F_ALDPS_XTAL_OFF);
1805 + if (of_property_read_bool(dev->of_node, "realtek,aldps-enable"))
1806 + priv->phycr1 |= RTL8211F_ALDPS_PLL_OFF | RTL8211F_ALDPS_ENABLE | RTL8211F_ALDPS_XTAL_OFF;
1808 + priv->has_phycr2 = !(phy_id == RTL_8211FVD_PHYID);
1809 + if (priv->has_phycr2) {
1810 + ret = phy_read_paged(phydev, 0xa43, RTL8211F_PHYCR2);
1814 + priv->phycr2 = ret & RTL8211F_CLKOUT_EN;
1815 + if (of_property_read_bool(dev->of_node, "realtek,clkout-disable"))
1816 + priv->phycr2 &= ~RTL8211F_CLKOUT_EN;
1819 + phydev->priv = priv;
1824 +static int rtl8201_ack_interrupt(struct phy_device *phydev)
1828 + err = phy_read(phydev, RTL8201F_ISR);
1830 + return (err < 0) ? err : 0;
1833 +static int rtl821x_ack_interrupt(struct phy_device *phydev)
1837 + err = phy_read(phydev, RTL821x_INSR);
1839 + return (err < 0) ? err : 0;
1842 +static int rtl8211f_ack_interrupt(struct phy_device *phydev)
1846 + err = phy_read_paged(phydev, 0xa43, RTL8211F_INSR);
1848 + return (err < 0) ? err : 0;
1851 +static int rtl8201_config_intr(struct phy_device *phydev)
1856 + if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
1857 + err = rtl8201_ack_interrupt(phydev);
1861 + val = BIT(13) | BIT(12) | BIT(11);
1862 + err = phy_write_paged(phydev, 0x7, RTL8201F_IER, val);
1865 + err = phy_write_paged(phydev, 0x7, RTL8201F_IER, val);
1869 + err = rtl8201_ack_interrupt(phydev);
1875 +static int rtl8211b_config_intr(struct phy_device *phydev)
1879 + if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
1880 + err = rtl821x_ack_interrupt(phydev);
1884 + err = phy_write(phydev, RTL821x_INER,
1885 + RTL8211B_INER_INIT);
1887 + err = phy_write(phydev, RTL821x_INER, 0);
1891 + err = rtl821x_ack_interrupt(phydev);
1897 +static int rtl8211e_config_intr(struct phy_device *phydev)
1901 + if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
1902 + err = rtl821x_ack_interrupt(phydev);
1906 + err = phy_write(phydev, RTL821x_INER,
1907 + RTL8211E_INER_LINK_STATUS);
1909 + err = phy_write(phydev, RTL821x_INER, 0);
1913 + err = rtl821x_ack_interrupt(phydev);
1919 +static int rtl8211f_config_intr(struct phy_device *phydev)
1924 + if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
1925 + err = rtl8211f_ack_interrupt(phydev);
1929 + val = RTL8211F_INER_LINK_STATUS;
1930 + err = phy_write_paged(phydev, 0xa42, RTL821x_INER, val);
1933 + err = phy_write_paged(phydev, 0xa42, RTL821x_INER, val);
1937 + err = rtl8211f_ack_interrupt(phydev);
1943 +static irqreturn_t rtl8201_handle_interrupt(struct phy_device *phydev)
1947 + irq_status = phy_read(phydev, RTL8201F_ISR);
1948 + if (irq_status < 0) {
1949 + phy_error(phydev);
1953 + if (!(irq_status & RTL8201F_ISR_MASK))
1956 + phy_trigger_machine(phydev);
1958 + return IRQ_HANDLED;
1961 +static irqreturn_t rtl821x_handle_interrupt(struct phy_device *phydev)
1963 + int irq_status, irq_enabled;
1965 + irq_status = phy_read(phydev, RTL821x_INSR);
1966 + if (irq_status < 0) {
1967 + phy_error(phydev);
1971 + irq_enabled = phy_read(phydev, RTL821x_INER);
1972 + if (irq_enabled < 0) {
1973 + phy_error(phydev);
1977 + if (!(irq_status & irq_enabled))
1980 + phy_trigger_machine(phydev);
1982 + return IRQ_HANDLED;
1985 +static irqreturn_t rtl8211f_handle_interrupt(struct phy_device *phydev)
1989 + irq_status = phy_read_paged(phydev, 0xa43, RTL8211F_INSR);
1990 + if (irq_status < 0) {
1991 + phy_error(phydev);
1995 + if (!(irq_status & RTL8211F_INER_LINK_STATUS))
1998 + phy_trigger_machine(phydev);
2000 + return IRQ_HANDLED;
2003 +static int rtl8211_config_aneg(struct phy_device *phydev)
2007 + ret = genphy_config_aneg(phydev);
2011 + /* Quirk was copied from vendor driver. Unfortunately it includes no
2012 + * description of the magic numbers.
2014 + if (phydev->speed == SPEED_100 && phydev->autoneg == AUTONEG_DISABLE) {
2015 + phy_write(phydev, 0x17, 0x2138);
2016 + phy_write(phydev, 0x0e, 0x0260);
2018 + phy_write(phydev, 0x17, 0x2108);
2019 + phy_write(phydev, 0x0e, 0x0000);
2025 +static int rtl8211c_config_init(struct phy_device *phydev)
2027 + /* RTL8211C has an issue when operating in Gigabit slave mode */
2028 + return phy_set_bits(phydev, MII_CTRL1000,
2029 + CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER);
2032 +static int rtl8211f_config_init(struct phy_device *phydev)
2034 + struct rtl821x_priv *priv = phydev->priv;
2035 + struct device *dev = &phydev->mdio.dev;
2036 + u16 val_txdly, val_rxdly;
2039 + ret = phy_modify_paged_changed(phydev, 0xa43, RTL8211F_PHYCR1,
2040 + RTL8211F_ALDPS_PLL_OFF | RTL8211F_ALDPS_ENABLE | RTL8211F_ALDPS_XTAL_OFF,
2043 + dev_err(dev, "aldps mode configuration failed: %pe\n",
2048 + switch (phydev->interface) {
2049 + case PHY_INTERFACE_MODE_RGMII:
2054 + case PHY_INTERFACE_MODE_RGMII_RXID:
2056 + val_rxdly = RTL8211F_RX_DELAY;
2059 + case PHY_INTERFACE_MODE_RGMII_TXID:
2060 + val_txdly = RTL8211F_TX_DELAY;
2064 + case PHY_INTERFACE_MODE_RGMII_ID:
2065 + val_txdly = RTL8211F_TX_DELAY;
2066 + val_rxdly = RTL8211F_RX_DELAY;
2069 + default: /* the rest of the modes imply leaving delay as is. */
2073 + ret = phy_modify_paged_changed(phydev, 0xd08, 0x11, RTL8211F_TX_DELAY,
2076 + dev_err(dev, "Failed to update the TX delay register\n");
2080 + "%s 2ns TX delay (and changing the value from pin-strapping RXD1 or the bootloader)\n",
2081 + val_txdly ? "Enabling" : "Disabling");
2084 + "2ns TX delay was already %s (by pin-strapping RXD1 or bootloader configuration)\n",
2085 + val_txdly ? "enabled" : "disabled");
2088 + ret = phy_modify_paged_changed(phydev, 0xd08, 0x15, RTL8211F_RX_DELAY,
2091 + dev_err(dev, "Failed to update the RX delay register\n");
2095 + "%s 2ns RX delay (and changing the value from pin-strapping RXD0 or the bootloader)\n",
2096 + val_rxdly ? "Enabling" : "Disabling");
2099 + "2ns RX delay was already %s (by pin-strapping RXD0 or bootloader configuration)\n",
2100 + val_rxdly ? "enabled" : "disabled");
2103 + if (priv->has_phycr2) {
2104 + ret = phy_modify_paged(phydev, 0xa43, RTL8211F_PHYCR2,
2105 + RTL8211F_CLKOUT_EN, priv->phycr2);
2107 + dev_err(dev, "clkout configuration failed: %pe\n",
2112 + return genphy_soft_reset(phydev);
2118 +static int rtl821x_suspend(struct phy_device *phydev)
2120 + struct rtl821x_priv *priv = phydev->priv;
2123 + if (!phydev->wol_enabled) {
2124 + ret = genphy_suspend(phydev);
2129 + clk_disable_unprepare(priv->clk);
2135 +static int rtl821x_resume(struct phy_device *phydev)
2137 + struct rtl821x_priv *priv = phydev->priv;
2140 + if (!phydev->wol_enabled)
2141 + clk_prepare_enable(priv->clk);
2143 + ret = genphy_resume(phydev);
2152 +static int rtl8211f_led_hw_is_supported(struct phy_device *phydev, u8 index,
2153 + unsigned long rules)
2155 + const unsigned long mask = BIT(TRIGGER_NETDEV_LINK_10) |
2156 + BIT(TRIGGER_NETDEV_LINK_100) |
2157 + BIT(TRIGGER_NETDEV_LINK_1000) |
2158 + BIT(TRIGGER_NETDEV_RX) |
2159 + BIT(TRIGGER_NETDEV_TX);
2161 + /* The RTL8211F PHY supports these LED settings on up to three LEDs:
2162 + * - Link: Configurable subset of 10/100/1000 link rates
2163 + * - Active: Blink on activity, RX or TX is not differentiated
2164 + * The Active option has two modes, A and B:
2165 + * - A: Link and Active indication at configurable, but matching,
2166 + * subset of 10/100/1000 link rates
2167 + * - B: Link indication at configurable subset of 10/100/1000 link
2168 + * rates and Active indication always at all three 10+100+1000
2170 + * This code currently uses mode B only.
2173 + if (index >= RTL8211F_LED_COUNT)
2176 + /* Filter out any other unsupported triggers. */
2177 + if (rules & ~mask)
2178 + return -EOPNOTSUPP;
2180 + /* RX and TX are not differentiated, either both are set or not set. */
2181 + if (!(rules & BIT(TRIGGER_NETDEV_RX)) ^ !(rules & BIT(TRIGGER_NETDEV_TX)))
2182 + return -EOPNOTSUPP;
2187 +static int rtl8211f_led_hw_control_get(struct phy_device *phydev, u8 index,
2188 + unsigned long *rules)
2192 + if (index >= RTL8211F_LED_COUNT)
2195 + val = phy_read_paged(phydev, 0xd04, RTL8211F_LEDCR);
2199 + val >>= RTL8211F_LEDCR_SHIFT * index;
2200 + val &= RTL8211F_LEDCR_MASK;
2202 + if (val & RTL8211F_LEDCR_LINK_10)
2203 + set_bit(TRIGGER_NETDEV_LINK_10, rules);
2205 + if (val & RTL8211F_LEDCR_LINK_100)
2206 + set_bit(TRIGGER_NETDEV_LINK_100, rules);
2208 + if (val & RTL8211F_LEDCR_LINK_1000)
2209 + set_bit(TRIGGER_NETDEV_LINK_1000, rules);
2211 + if (val & RTL8211F_LEDCR_ACT_TXRX) {
2212 + set_bit(TRIGGER_NETDEV_RX, rules);
2213 + set_bit(TRIGGER_NETDEV_TX, rules);
2219 +static int rtl8211f_led_hw_control_set(struct phy_device *phydev, u8 index,
2220 + unsigned long rules)
2222 + const u16 mask = RTL8211F_LEDCR_MASK << (RTL8211F_LEDCR_SHIFT * index);
2225 + if (index >= RTL8211F_LED_COUNT)
2228 + if (test_bit(TRIGGER_NETDEV_LINK_10, &rules))
2229 + reg |= RTL8211F_LEDCR_LINK_10;
2231 + if (test_bit(TRIGGER_NETDEV_LINK_100, &rules))
2232 + reg |= RTL8211F_LEDCR_LINK_100;
2234 + if (test_bit(TRIGGER_NETDEV_LINK_1000, &rules))
2235 + reg |= RTL8211F_LEDCR_LINK_1000;
2237 + if (test_bit(TRIGGER_NETDEV_RX, &rules) ||
2238 + test_bit(TRIGGER_NETDEV_TX, &rules)) {
2239 + reg |= RTL8211F_LEDCR_ACT_TXRX;
2242 + reg <<= RTL8211F_LEDCR_SHIFT * index;
2243 + reg |= RTL8211F_LEDCR_MODE; /* Mode B */
2245 + return phy_modify_paged(phydev, 0xd04, RTL8211F_LEDCR, mask, reg);
2248 +static int rtl8211e_config_init(struct phy_device *phydev)
2250 + int ret = 0, oldpage;
2253 + /* enable TX/RX delay for rgmii-* modes, and disable them for rgmii. */
2254 + switch (phydev->interface) {
2255 + case PHY_INTERFACE_MODE_RGMII:
2256 + val = RTL8211E_CTRL_DELAY | 0;
2258 + case PHY_INTERFACE_MODE_RGMII_ID:
2259 + val = RTL8211E_CTRL_DELAY | RTL8211E_TX_DELAY | RTL8211E_RX_DELAY;
2261 + case PHY_INTERFACE_MODE_RGMII_RXID:
2262 + val = RTL8211E_CTRL_DELAY | RTL8211E_RX_DELAY;
2264 + case PHY_INTERFACE_MODE_RGMII_TXID:
2265 + val = RTL8211E_CTRL_DELAY | RTL8211E_TX_DELAY;
2267 + default: /* the rest of the modes imply leaving delays as is. */
2271 + /* According to a sample driver there is a 0x1c config register on the
2272 + * 0xa4 extension page (0x7) layout. It can be used to disable/enable
2273 + * the RX/TX delays otherwise controlled by RXDLY/TXDLY pins.
2274 + * The configuration register definition:
2276 + * 13 = Force Tx RX Delay controlled by bit12 bit11,
2277 + * 12 = RX Delay, 11 = TX Delay
2278 + * 10:0 = Test && debug settings reserved by realtek
2280 + oldpage = phy_select_page(phydev, 0x7);
2282 + goto err_restore_page;
2284 + ret = __phy_write(phydev, RTL821x_EXT_PAGE_SELECT, 0xa4);
2286 + goto err_restore_page;
2288 + ret = __phy_modify(phydev, 0x1c, RTL8211E_CTRL_DELAY
2289 + | RTL8211E_TX_DELAY | RTL8211E_RX_DELAY,
2293 + return phy_restore_page(phydev, oldpage, ret);
2296 +static int rtl8211b_suspend(struct phy_device *phydev)
2298 + phy_write(phydev, MII_MMD_DATA, BIT(9));
2300 + return genphy_suspend(phydev);
2303 +static int rtl8211b_resume(struct phy_device *phydev)
2305 + phy_write(phydev, MII_MMD_DATA, 0);
2307 + return genphy_resume(phydev);
2310 +static int rtl8366rb_config_init(struct phy_device *phydev)
2314 + ret = phy_set_bits(phydev, RTL8366RB_POWER_SAVE,
2315 + RTL8366RB_POWER_SAVE_ON);
2317 + dev_err(&phydev->mdio.dev,
2318 + "error enabling power management\n");
2324 +/* get actual speed to cover the downshift case */
2325 +static void rtlgen_decode_physr(struct phy_device *phydev, int val)
2331 + if (val & RTL_VND2_PHYSR_DUPLEX)
2332 + phydev->duplex = DUPLEX_FULL;
2334 + phydev->duplex = DUPLEX_HALF;
2336 + switch (val & RTL_VND2_PHYSR_SPEED_MASK) {
2338 + phydev->speed = SPEED_10;
2341 + phydev->speed = SPEED_100;
2344 + phydev->speed = SPEED_1000;
2347 + phydev->speed = SPEED_10000;
2350 + phydev->speed = SPEED_2500;
2353 + phydev->speed = SPEED_5000;
2363 + if (phydev->speed >= 1000) {
2364 + if (val & RTL_VND2_PHYSR_MASTER)
2365 + phydev->master_slave_state = MASTER_SLAVE_STATE_MASTER;
2367 + phydev->master_slave_state = MASTER_SLAVE_STATE_SLAVE;
2369 + phydev->master_slave_state = MASTER_SLAVE_STATE_UNSUPPORTED;
2373 +static int rtlgen_read_status(struct phy_device *phydev)
2377 + ret = genphy_read_status(phydev);
2381 + if (!phydev->link)
2384 + val = phy_read_paged(phydev, 0xa43, 0x12);
2388 + rtlgen_decode_physr(phydev, val);
2393 +static int rtlgen_read_mmd(struct phy_device *phydev, int devnum, u16 regnum)
2397 + if (devnum == MDIO_MMD_VEND2) {
2398 + rtl821x_write_page(phydev, regnum >> 4);
2399 + ret = __phy_read(phydev, 0x10 + ((regnum & 0xf) >> 1));
2400 + rtl821x_write_page(phydev, 0);
2401 + } else if (devnum == MDIO_MMD_PCS && regnum == MDIO_PCS_EEE_ABLE) {
2402 + rtl821x_write_page(phydev, 0xa5c);
2403 + ret = __phy_read(phydev, 0x12);
2404 + rtl821x_write_page(phydev, 0);
2405 + } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV) {
2406 + rtl821x_write_page(phydev, 0xa5d);
2407 + ret = __phy_read(phydev, 0x10);
2408 + rtl821x_write_page(phydev, 0);
2409 + } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_LPABLE) {
2410 + rtl821x_write_page(phydev, 0xa5d);
2411 + ret = __phy_read(phydev, 0x11);
2412 + rtl821x_write_page(phydev, 0);
2414 + ret = -EOPNOTSUPP;
2420 +static int rtlgen_write_mmd(struct phy_device *phydev, int devnum, u16 regnum,
2425 + if (devnum == MDIO_MMD_VEND2) {
2426 + rtl821x_write_page(phydev, regnum >> 4);
2427 + ret = __phy_write(phydev, 0x10 + ((regnum & 0xf) >> 1), val);
2428 + rtl821x_write_page(phydev, 0);
2429 + } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV) {
2430 + rtl821x_write_page(phydev, 0xa5d);
2431 + ret = __phy_write(phydev, 0x10, val);
2432 + rtl821x_write_page(phydev, 0);
2434 + ret = -EOPNOTSUPP;
2440 +static int rtl822x_read_mmd(struct phy_device *phydev, int devnum, u16 regnum)
2442 + int ret = rtlgen_read_mmd(phydev, devnum, regnum);
2444 + if (ret != -EOPNOTSUPP)
2447 + if (devnum == MDIO_MMD_PCS && regnum == MDIO_PCS_EEE_ABLE2) {
2448 + rtl821x_write_page(phydev, 0xa6e);
2449 + ret = __phy_read(phydev, 0x16);
2450 + rtl821x_write_page(phydev, 0);
2451 + } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV2) {
2452 + rtl821x_write_page(phydev, 0xa6d);
2453 + ret = __phy_read(phydev, 0x12);
2454 + rtl821x_write_page(phydev, 0);
2455 + } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_LPABLE2) {
2456 + rtl821x_write_page(phydev, 0xa6d);
2457 + ret = __phy_read(phydev, 0x10);
2458 + rtl821x_write_page(phydev, 0);
2464 +static int rtl822x_write_mmd(struct phy_device *phydev, int devnum, u16 regnum,
2467 + int ret = rtlgen_write_mmd(phydev, devnum, regnum, val);
2469 + if (ret != -EOPNOTSUPP)
2472 + if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV2) {
2473 + rtl821x_write_page(phydev, 0xa6d);
2474 + ret = __phy_write(phydev, 0x12, val);
2475 + rtl821x_write_page(phydev, 0);
2481 +static int rtl822xb_config_init(struct phy_device *phydev)
2483 + bool has_2500, has_sgmii;
2487 + has_2500 = test_bit(PHY_INTERFACE_MODE_2500BASEX,
2488 + phydev->host_interfaces) ||
2489 + phydev->interface == PHY_INTERFACE_MODE_2500BASEX;
2491 + has_sgmii = test_bit(PHY_INTERFACE_MODE_SGMII,
2492 + phydev->host_interfaces) ||
2493 + phydev->interface == PHY_INTERFACE_MODE_SGMII;
2495 + /* fill in possible interfaces */
2496 + __assign_bit(PHY_INTERFACE_MODE_2500BASEX, phydev->possible_interfaces,
2498 + __assign_bit(PHY_INTERFACE_MODE_SGMII, phydev->possible_interfaces,
2501 + if (!has_2500 && !has_sgmii)
2504 + /* determine SerDes option mode */
2505 + if (has_2500 && !has_sgmii) {
2506 + mode = RTL822X_VND1_SERDES_OPTION_MODE_2500BASEX;
2507 + phydev->rate_matching = RATE_MATCH_PAUSE;
2509 + mode = RTL822X_VND1_SERDES_OPTION_MODE_2500BASEX_SGMII;
2510 + phydev->rate_matching = RATE_MATCH_NONE;
2513 + /* the following sequence with magic numbers sets up the SerDes
2516 + ret = phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x75f3, 0);
2520 + ret = phy_modify_mmd_changed(phydev, MDIO_MMD_VEND1,
2521 + RTL822X_VND1_SERDES_OPTION,
2522 + RTL822X_VND1_SERDES_OPTION_MODE_MASK,
2527 + ret = phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x6a04, 0x0503);
2531 + ret = phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x6f10, 0xd455);
2535 + return phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x6f11, 0x8020);
2538 +static int rtl822xb_get_rate_matching(struct phy_device *phydev,
2539 + phy_interface_t iface)
2543 + /* Only rate matching at 2500base-x */
2544 + if (iface != PHY_INTERFACE_MODE_2500BASEX)
2545 + return RATE_MATCH_NONE;
2547 + val = phy_read_mmd(phydev, MDIO_MMD_VEND1, RTL822X_VND1_SERDES_OPTION);
2551 + if ((val & RTL822X_VND1_SERDES_OPTION_MODE_MASK) ==
2552 + RTL822X_VND1_SERDES_OPTION_MODE_2500BASEX)
2553 + return RATE_MATCH_PAUSE;
2555 + /* RTL822X_VND1_SERDES_OPTION_MODE_2500BASEX_SGMII */
2556 + return RATE_MATCH_NONE;
2559 +static int rtl822x_get_features(struct phy_device *phydev)
2563 + val = phy_read_paged(phydev, 0xa61, 0x13);
2567 + linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
2568 + phydev->supported, val & MDIO_PMA_SPEED_2_5G);
2569 + linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
2570 + phydev->supported, val & MDIO_PMA_SPEED_5G);
2571 + linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
2572 + phydev->supported, val & MDIO_SPEED_10G);
2574 + return genphy_read_abilities(phydev);
2577 +static int rtl822x_config_aneg(struct phy_device *phydev)
2581 + if (phydev->autoneg == AUTONEG_ENABLE) {
2582 + u16 adv = linkmode_adv_to_mii_10gbt_adv_t(phydev->advertising);
2584 + ret = phy_modify_paged_changed(phydev, 0xa5d, 0x12,
2585 + MDIO_AN_10GBT_CTRL_ADV2_5G |
2586 + MDIO_AN_10GBT_CTRL_ADV5G,
2592 + return __genphy_config_aneg(phydev, ret);
2595 +static void rtl822xb_update_interface(struct phy_device *phydev)
2599 + if (!phydev->link)
2602 + /* Change interface according to serdes mode */
2603 + val = phy_read_mmd(phydev, MDIO_MMD_VEND1, RTL822X_VND1_SERDES_CTRL3);
2607 + switch (val & RTL822X_VND1_SERDES_CTRL3_MODE_MASK) {
2608 + case RTL822X_VND1_SERDES_CTRL3_MODE_2500BASEX:
2609 + phydev->interface = PHY_INTERFACE_MODE_2500BASEX;
2611 + case RTL822X_VND1_SERDES_CTRL3_MODE_SGMII:
2612 + phydev->interface = PHY_INTERFACE_MODE_SGMII;
2617 +static int rtl822x_read_status(struct phy_device *phydev)
2621 + mii_10gbt_stat_mod_linkmode_lpa_t(phydev->lp_advertising, 0);
2623 + ret = rtlgen_read_status(phydev);
2627 + if (phydev->autoneg == AUTONEG_DISABLE ||
2628 + !phydev->autoneg_complete)
2631 + lpadv = phy_read_paged(phydev, 0xa5d, 0x13);
2635 + mii_10gbt_stat_mod_linkmode_lpa_t(phydev->lp_advertising, lpadv);
2640 +static int rtl822xb_read_status(struct phy_device *phydev)
2644 + ret = rtl822x_read_status(phydev);
2648 + rtl822xb_update_interface(phydev);
2653 +static int rtl822x_c45_get_features(struct phy_device *phydev)
2655 + linkmode_set_bit(ETHTOOL_LINK_MODE_TP_BIT,
2656 + phydev->supported);
2658 + return genphy_c45_pma_read_abilities(phydev);
2661 +static int rtl822x_c45_config_aneg(struct phy_device *phydev)
2663 + bool changed = false;
2666 + if (phydev->autoneg == AUTONEG_DISABLE)
2667 + return genphy_c45_pma_setup_forced(phydev);
2669 + ret = genphy_c45_an_config_aneg(phydev);
2675 + val = linkmode_adv_to_mii_ctrl1000_t(phydev->advertising);
2677 + /* Vendor register as C45 has no standardized support for 1000BaseT */
2678 + ret = phy_modify_mmd_changed(phydev, MDIO_MMD_VEND2, RTL822X_VND2_GBCR,
2679 + ADVERTISE_1000FULL, val);
2685 + return genphy_c45_check_and_restart_aneg(phydev, changed);
2688 +static int rtl822x_c45_read_status(struct phy_device *phydev)
2692 + /* Vendor register as C45 has no standardized support for 1000BaseT */
2693 + if (phydev->autoneg == AUTONEG_ENABLE && genphy_c45_aneg_done(phydev)) {
2694 + val = phy_read_mmd(phydev, MDIO_MMD_VEND2,
2695 + RTL822X_VND2_GANLPAR);
2701 + mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, val);
2703 + ret = genphy_c45_read_status(phydev);
2707 + if (!phydev->link) {
2708 + phydev->master_slave_state = MASTER_SLAVE_STATE_UNKNOWN;
2712 + /* Read actual speed from vendor register. */
2713 + val = phy_read_mmd(phydev, MDIO_MMD_VEND2, RTL_VND2_PHYSR);
2717 + rtlgen_decode_physr(phydev, val);
2722 +static int rtl822xb_c45_read_status(struct phy_device *phydev)
2726 + ret = rtl822x_c45_read_status(phydev);
2730 + rtl822xb_update_interface(phydev);
2735 +static bool rtlgen_supports_2_5gbps(struct phy_device *phydev)
2739 + phy_write(phydev, RTL821x_PAGE_SELECT, 0xa61);
2740 + val = phy_read(phydev, 0x13);
2741 + phy_write(phydev, RTL821x_PAGE_SELECT, 0);
2743 + return val >= 0 && val & MDIO_PMA_SPEED_2_5G;
2746 +/* On internal PHY's MMD reads over C22 always return 0.
2747 + * Check a MMD register which is known to be non-zero.
2749 +static bool rtlgen_supports_mmd(struct phy_device *phydev)
2753 + phy_lock_mdio_bus(phydev);
2754 + __phy_write(phydev, MII_MMD_CTRL, MDIO_MMD_PCS);
2755 + __phy_write(phydev, MII_MMD_DATA, MDIO_PCS_EEE_ABLE);
2756 + __phy_write(phydev, MII_MMD_CTRL, MDIO_MMD_PCS | MII_MMD_CTRL_NOINCR);
2757 + val = __phy_read(phydev, MII_MMD_DATA);
2758 + phy_unlock_mdio_bus(phydev);
2763 +static int rtlgen_match_phy_device(struct phy_device *phydev)
2765 + return phydev->phy_id == RTL_GENERIC_PHYID &&
2766 + !rtlgen_supports_2_5gbps(phydev);
2769 +static int rtl8226_match_phy_device(struct phy_device *phydev)
2771 + return phydev->phy_id == RTL_GENERIC_PHYID &&
2772 + rtlgen_supports_2_5gbps(phydev) &&
2773 + rtlgen_supports_mmd(phydev);
2776 +static int rtlgen_is_c45_match(struct phy_device *phydev, unsigned int id,
2779 + if (phydev->is_c45)
2780 + return is_c45 && (id == phydev->c45_ids.device_ids[1]);
2782 + return !is_c45 && (id == phydev->phy_id);
2785 +static int rtl8221b_match_phy_device(struct phy_device *phydev)
2787 + return phydev->phy_id == RTL_8221B && rtlgen_supports_mmd(phydev);
2790 +static int rtl8221b_vb_cg_c22_match_phy_device(struct phy_device *phydev)
2792 + return rtlgen_is_c45_match(phydev, RTL_8221B_VB_CG, false);
2795 +static int rtl8221b_vb_cg_c45_match_phy_device(struct phy_device *phydev)
2797 + return rtlgen_is_c45_match(phydev, RTL_8221B_VB_CG, true);
2800 +static int rtl8221b_vn_cg_c22_match_phy_device(struct phy_device *phydev)
2802 + return rtlgen_is_c45_match(phydev, RTL_8221B_VN_CG, false);
2805 +static int rtl8221b_vn_cg_c45_match_phy_device(struct phy_device *phydev)
2807 + return rtlgen_is_c45_match(phydev, RTL_8221B_VN_CG, true);
2810 +static int rtl_internal_nbaset_match_phy_device(struct phy_device *phydev)
2812 + if (phydev->is_c45)
2815 + switch (phydev->phy_id) {
2816 + case RTL_GENERIC_PHYID:
2825 + return rtlgen_supports_2_5gbps(phydev) && !rtlgen_supports_mmd(phydev);
2828 +static int rtl8251b_c45_match_phy_device(struct phy_device *phydev)
2830 + return rtlgen_is_c45_match(phydev, RTL_8251B, true);
2833 +static int rtlgen_resume(struct phy_device *phydev)
2835 + int ret = genphy_resume(phydev);
2837 + /* Internal PHY's from RTL8168h up may not be instantly ready */
2843 +static int rtlgen_c45_resume(struct phy_device *phydev)
2845 + int ret = genphy_c45_pma_resume(phydev);
2852 +static int rtl9000a_config_init(struct phy_device *phydev)
2854 + phydev->autoneg = AUTONEG_DISABLE;
2855 + phydev->speed = SPEED_100;
2856 + phydev->duplex = DUPLEX_FULL;
2861 +static int rtl9000a_config_aneg(struct phy_device *phydev)
2866 + switch (phydev->master_slave_set) {
2867 + case MASTER_SLAVE_CFG_MASTER_FORCE:
2868 + ctl |= CTL1000_AS_MASTER;
2870 + case MASTER_SLAVE_CFG_SLAVE_FORCE:
2872 + case MASTER_SLAVE_CFG_UNKNOWN:
2873 + case MASTER_SLAVE_CFG_UNSUPPORTED:
2876 + phydev_warn(phydev, "Unsupported Master/Slave mode\n");
2877 + return -EOPNOTSUPP;
2880 + ret = phy_modify_changed(phydev, MII_CTRL1000, CTL1000_AS_MASTER, ctl);
2882 + ret = genphy_soft_reset(phydev);
2887 +static int rtl9000a_read_status(struct phy_device *phydev)
2891 + phydev->master_slave_get = MASTER_SLAVE_CFG_UNKNOWN;
2892 + phydev->master_slave_state = MASTER_SLAVE_STATE_UNKNOWN;
2894 + ret = genphy_update_link(phydev);
2898 + ret = phy_read(phydev, MII_CTRL1000);
2901 + if (ret & CTL1000_AS_MASTER)
2902 + phydev->master_slave_get = MASTER_SLAVE_CFG_MASTER_FORCE;
2904 + phydev->master_slave_get = MASTER_SLAVE_CFG_SLAVE_FORCE;
2906 + ret = phy_read(phydev, MII_STAT1000);
2909 + if (ret & LPA_1000MSRES)
2910 + phydev->master_slave_state = MASTER_SLAVE_STATE_MASTER;
2912 + phydev->master_slave_state = MASTER_SLAVE_STATE_SLAVE;
2917 +static int rtl9000a_ack_interrupt(struct phy_device *phydev)
2921 + err = phy_read(phydev, RTL8211F_INSR);
2923 + return (err < 0) ? err : 0;
2926 +static int rtl9000a_config_intr(struct phy_device *phydev)
2931 + if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
2932 + err = rtl9000a_ack_interrupt(phydev);
2936 + val = (u16)~RTL9000A_GINMR_LINK_STATUS;
2937 + err = phy_write_paged(phydev, 0xa42, RTL9000A_GINMR, val);
2940 + err = phy_write_paged(phydev, 0xa42, RTL9000A_GINMR, val);
2944 + err = rtl9000a_ack_interrupt(phydev);
2947 + return phy_write_paged(phydev, 0xa42, RTL9000A_GINMR, val);
2950 +static irqreturn_t rtl9000a_handle_interrupt(struct phy_device *phydev)
2954 + irq_status = phy_read(phydev, RTL8211F_INSR);
2955 + if (irq_status < 0) {
2956 + phy_error(phydev);
2960 + if (!(irq_status & RTL8211F_INER_LINK_STATUS))
2963 + phy_trigger_machine(phydev);
2965 + return IRQ_HANDLED;
2968 +static struct phy_driver realtek_drvs[] = {
2970 + PHY_ID_MATCH_EXACT(0x00008201),
2971 + .name = "RTL8201CP Ethernet",
2972 + .read_page = rtl821x_read_page,
2973 + .write_page = rtl821x_write_page,
2975 + PHY_ID_MATCH_EXACT(0x001cc816),
2976 + .name = "RTL8201F Fast Ethernet",
2977 + .config_intr = &rtl8201_config_intr,
2978 + .handle_interrupt = rtl8201_handle_interrupt,
2979 + .suspend = genphy_suspend,
2980 + .resume = genphy_resume,
2981 + .read_page = rtl821x_read_page,
2982 + .write_page = rtl821x_write_page,
2984 + PHY_ID_MATCH_MODEL(0x001cc880),
2985 + .name = "RTL8208 Fast Ethernet",
2986 + .read_mmd = genphy_read_mmd_unsupported,
2987 + .write_mmd = genphy_write_mmd_unsupported,
2988 + .suspend = genphy_suspend,
2989 + .resume = genphy_resume,
2990 + .read_page = rtl821x_read_page,
2991 + .write_page = rtl821x_write_page,
2993 + PHY_ID_MATCH_EXACT(0x001cc910),
2994 + .name = "RTL8211 Gigabit Ethernet",
2995 + .config_aneg = rtl8211_config_aneg,
2996 + .read_mmd = &genphy_read_mmd_unsupported,
2997 + .write_mmd = &genphy_write_mmd_unsupported,
2998 + .read_page = rtl821x_read_page,
2999 + .write_page = rtl821x_write_page,
3001 + PHY_ID_MATCH_EXACT(0x001cc912),
3002 + .name = "RTL8211B Gigabit Ethernet",
3003 + .config_intr = &rtl8211b_config_intr,
3004 + .handle_interrupt = rtl821x_handle_interrupt,
3005 + .read_mmd = &genphy_read_mmd_unsupported,
3006 + .write_mmd = &genphy_write_mmd_unsupported,
3007 + .suspend = rtl8211b_suspend,
3008 + .resume = rtl8211b_resume,
3009 + .read_page = rtl821x_read_page,
3010 + .write_page = rtl821x_write_page,
3012 + PHY_ID_MATCH_EXACT(0x001cc913),
3013 + .name = "RTL8211C Gigabit Ethernet",
3014 + .config_init = rtl8211c_config_init,
3015 + .read_mmd = &genphy_read_mmd_unsupported,
3016 + .write_mmd = &genphy_write_mmd_unsupported,
3017 + .read_page = rtl821x_read_page,
3018 + .write_page = rtl821x_write_page,
3020 + PHY_ID_MATCH_EXACT(0x001cc914),
3021 + .name = "RTL8211DN Gigabit Ethernet",
3022 + .config_intr = rtl8211e_config_intr,
3023 + .handle_interrupt = rtl821x_handle_interrupt,
3024 + .suspend = genphy_suspend,
3025 + .resume = genphy_resume,
3026 + .read_page = rtl821x_read_page,
3027 + .write_page = rtl821x_write_page,
3029 + PHY_ID_MATCH_EXACT(0x001cc915),
3030 + .name = "RTL8211E Gigabit Ethernet",
3031 + .config_init = &rtl8211e_config_init,
3032 + .config_intr = &rtl8211e_config_intr,
3033 + .handle_interrupt = rtl821x_handle_interrupt,
3034 + .suspend = genphy_suspend,
3035 + .resume = genphy_resume,
3036 + .read_page = rtl821x_read_page,
3037 + .write_page = rtl821x_write_page,
3039 + PHY_ID_MATCH_EXACT(0x001cc916),
3040 + .name = "RTL8211F Gigabit Ethernet",
3041 + .probe = rtl821x_probe,
3042 + .config_init = &rtl8211f_config_init,
3043 + .read_status = rtlgen_read_status,
3044 + .config_intr = &rtl8211f_config_intr,
3045 + .handle_interrupt = rtl8211f_handle_interrupt,
3046 + .suspend = rtl821x_suspend,
3047 + .resume = rtl821x_resume,
3048 + .read_page = rtl821x_read_page,
3049 + .write_page = rtl821x_write_page,
3050 + .flags = PHY_ALWAYS_CALL_SUSPEND,
3051 + .led_hw_is_supported = rtl8211f_led_hw_is_supported,
3052 + .led_hw_control_get = rtl8211f_led_hw_control_get,
3053 + .led_hw_control_set = rtl8211f_led_hw_control_set,
3055 + PHY_ID_MATCH_EXACT(RTL_8211FVD_PHYID),
3056 + .name = "RTL8211F-VD Gigabit Ethernet",
3057 + .probe = rtl821x_probe,
3058 + .config_init = &rtl8211f_config_init,
3059 + .read_status = rtlgen_read_status,
3060 + .config_intr = &rtl8211f_config_intr,
3061 + .handle_interrupt = rtl8211f_handle_interrupt,
3062 + .suspend = rtl821x_suspend,
3063 + .resume = rtl821x_resume,
3064 + .read_page = rtl821x_read_page,
3065 + .write_page = rtl821x_write_page,
3066 + .flags = PHY_ALWAYS_CALL_SUSPEND,
3068 + .name = "Generic FE-GE Realtek PHY",
3069 + .match_phy_device = rtlgen_match_phy_device,
3070 + .read_status = rtlgen_read_status,
3071 + .suspend = genphy_suspend,
3072 + .resume = rtlgen_resume,
3073 + .read_page = rtl821x_read_page,
3074 + .write_page = rtl821x_write_page,
3075 + .read_mmd = rtlgen_read_mmd,
3076 + .write_mmd = rtlgen_write_mmd,
3078 + .name = "RTL8226 2.5Gbps PHY",
3079 + .match_phy_device = rtl8226_match_phy_device,
3080 + .get_features = rtl822x_get_features,
3081 + .config_aneg = rtl822x_config_aneg,
3082 + .read_status = rtl822x_read_status,
3083 + .suspend = genphy_suspend,
3084 + .resume = rtlgen_resume,
3085 + .read_page = rtl821x_read_page,
3086 + .write_page = rtl821x_write_page,
3088 + .match_phy_device = rtl8221b_match_phy_device,
3089 + .name = "RTL8226B_RTL8221B 2.5Gbps PHY",
3090 + .get_features = rtl822x_get_features,
3091 + .config_aneg = rtl822x_config_aneg,
3092 + .config_init = rtl822xb_config_init,
3093 + .get_rate_matching = rtl822xb_get_rate_matching,
3094 + .read_status = rtl822xb_read_status,
3095 + .suspend = genphy_suspend,
3096 + .resume = rtlgen_resume,
3097 + .read_page = rtl821x_read_page,
3098 + .write_page = rtl821x_write_page,
3100 + PHY_ID_MATCH_EXACT(0x001cc838),
3101 + .name = "RTL8226-CG 2.5Gbps PHY",
3102 + .get_features = rtl822x_get_features,
3103 + .config_aneg = rtl822x_config_aneg,
3104 + .read_status = rtl822x_read_status,
3105 + .suspend = genphy_suspend,
3106 + .resume = rtlgen_resume,
3107 + .read_page = rtl821x_read_page,
3108 + .write_page = rtl821x_write_page,
3110 + PHY_ID_MATCH_EXACT(0x001cc848),
3111 + .name = "RTL8226B-CG_RTL8221B-CG 2.5Gbps PHY",
3112 + .get_features = rtl822x_get_features,
3113 + .config_aneg = rtl822x_config_aneg,
3114 + .config_init = rtl822xb_config_init,
3115 + .get_rate_matching = rtl822xb_get_rate_matching,
3116 + .read_status = rtl822xb_read_status,
3117 + .suspend = genphy_suspend,
3118 + .resume = rtlgen_resume,
3119 + .read_page = rtl821x_read_page,
3120 + .write_page = rtl821x_write_page,
3122 + .match_phy_device = rtl8221b_vb_cg_c22_match_phy_device,
3123 + .name = "RTL8221B-VB-CG 2.5Gbps PHY (C22)",
3124 + .get_features = rtl822x_get_features,
3125 + .config_aneg = rtl822x_config_aneg,
3126 + .config_init = rtl822xb_config_init,
3127 + .get_rate_matching = rtl822xb_get_rate_matching,
3128 + .read_status = rtl822xb_read_status,
3129 + .suspend = genphy_suspend,
3130 + .resume = rtlgen_resume,
3131 + .read_page = rtl821x_read_page,
3132 + .write_page = rtl821x_write_page,
3134 + .match_phy_device = rtl8221b_vb_cg_c45_match_phy_device,
3135 + .name = "RTL8221B-VB-CG 2.5Gbps PHY (C45)",
3136 + .config_init = rtl822xb_config_init,
3137 + .get_rate_matching = rtl822xb_get_rate_matching,
3138 + .get_features = rtl822x_c45_get_features,
3139 + .config_aneg = rtl822x_c45_config_aneg,
3140 + .read_status = rtl822xb_c45_read_status,
3141 + .suspend = genphy_c45_pma_suspend,
3142 + .resume = rtlgen_c45_resume,
3144 + .match_phy_device = rtl8221b_vn_cg_c22_match_phy_device,
3145 + .name = "RTL8221B-VM-CG 2.5Gbps PHY (C22)",
3146 + .get_features = rtl822x_get_features,
3147 + .config_aneg = rtl822x_config_aneg,
3148 + .config_init = rtl822xb_config_init,
3149 + .get_rate_matching = rtl822xb_get_rate_matching,
3150 + .read_status = rtl822xb_read_status,
3151 + .suspend = genphy_suspend,
3152 + .resume = rtlgen_resume,
3153 + .read_page = rtl821x_read_page,
3154 + .write_page = rtl821x_write_page,
3156 + .match_phy_device = rtl8221b_vn_cg_c45_match_phy_device,
3157 + .name = "RTL8221B-VN-CG 2.5Gbps PHY (C45)",
3158 + .config_init = rtl822xb_config_init,
3159 + .get_rate_matching = rtl822xb_get_rate_matching,
3160 + .get_features = rtl822x_c45_get_features,
3161 + .config_aneg = rtl822x_c45_config_aneg,
3162 + .read_status = rtl822xb_c45_read_status,
3163 + .suspend = genphy_c45_pma_suspend,
3164 + .resume = rtlgen_c45_resume,
3166 + .match_phy_device = rtl8251b_c45_match_phy_device,
3167 + .name = "RTL8251B 5Gbps PHY",
3168 + .get_features = rtl822x_get_features,
3169 + .config_aneg = rtl822x_config_aneg,
3170 + .read_status = rtl822x_read_status,
3171 + .suspend = genphy_suspend,
3172 + .resume = rtlgen_resume,
3173 + .read_page = rtl821x_read_page,
3174 + .write_page = rtl821x_write_page,
3176 + .match_phy_device = rtl_internal_nbaset_match_phy_device,
3177 + .name = "Realtek Internal NBASE-T PHY",
3178 + .flags = PHY_IS_INTERNAL,
3179 + .get_features = rtl822x_get_features,
3180 + .config_aneg = rtl822x_config_aneg,
3181 + .read_status = rtl822x_read_status,
3182 + .suspend = genphy_suspend,
3183 + .resume = rtlgen_resume,
3184 + .read_page = rtl821x_read_page,
3185 + .write_page = rtl821x_write_page,
3186 + .read_mmd = rtl822x_read_mmd,
3187 + .write_mmd = rtl822x_write_mmd,
3189 + PHY_ID_MATCH_EXACT(0x001ccad0),
3190 + .name = "RTL8224 2.5Gbps PHY",
3191 + .get_features = rtl822x_c45_get_features,
3192 + .config_aneg = rtl822x_c45_config_aneg,
3193 + .read_status = rtl822x_c45_read_status,
3194 + .suspend = genphy_c45_pma_suspend,
3195 + .resume = rtlgen_c45_resume,
3197 + PHY_ID_MATCH_EXACT(0x001cc961),
3198 + .name = "RTL8366RB Gigabit Ethernet",
3199 + .config_init = &rtl8366rb_config_init,
3200 + /* These interrupts are handled by the irq controller
3201 + * embedded inside the RTL8366RB, they get unmasked when the
3202 + * irq is requested and ACKed by reading the status register,
3203 + * which is done by the irqchip code.
3205 + .config_intr = genphy_no_config_intr,
3206 + .handle_interrupt = genphy_handle_interrupt_no_ack,
3207 + .suspend = genphy_suspend,
3208 + .resume = genphy_resume,
3210 + PHY_ID_MATCH_EXACT(0x001ccb00),
3211 + .name = "RTL9000AA_RTL9000AN Ethernet",
3212 + .features = PHY_BASIC_T1_FEATURES,
3213 + .config_init = rtl9000a_config_init,
3214 + .config_aneg = rtl9000a_config_aneg,
3215 + .read_status = rtl9000a_read_status,
3216 + .config_intr = rtl9000a_config_intr,
3217 + .handle_interrupt = rtl9000a_handle_interrupt,
3218 + .suspend = genphy_suspend,
3219 + .resume = genphy_resume,
3220 + .read_page = rtl821x_read_page,
3221 + .write_page = rtl821x_write_page,
3223 + PHY_ID_MATCH_EXACT(0x001cc942),
3224 + .name = "RTL8365MB-VC Gigabit Ethernet",
3225 + /* Interrupt handling analogous to RTL8366RB */
3226 + .config_intr = genphy_no_config_intr,
3227 + .handle_interrupt = genphy_handle_interrupt_no_ack,
3228 + .suspend = genphy_suspend,
3229 + .resume = genphy_resume,
3231 + PHY_ID_MATCH_EXACT(0x001cc960),
3232 + .name = "RTL8366S Gigabit Ethernet",
3233 + .suspend = genphy_suspend,
3234 + .resume = genphy_resume,
3235 + .read_mmd = genphy_read_mmd_unsupported,
3236 + .write_mmd = genphy_write_mmd_unsupported,
3240 +module_phy_driver(realtek_drvs);
3242 +static const struct mdio_device_id __maybe_unused realtek_tbl[] = {
3243 + { PHY_ID_MATCH_VENDOR(0x001cc800) },
3247 +MODULE_DEVICE_TABLE(mdio, realtek_tbl);