62bbf32f1a7ed20bf678ed073638b688cde739e1
[openwrt/staging/xback.git] /
1 From 7c6fa3ffd2650347b1d37f028e232e53d617c1af Mon Sep 17 00:00:00 2001
2 From: Michael Klein <michael@fossekall.de>
3 Date: Sun, 4 May 2025 19:29:12 +0200
4 Subject: [PATCH] net: phy: realtek: Clean up RTL821x ExtPage access
5
6 Factor out RTL8211E extension page access code to
7 rtl821x_modify_ext_page() and clean up rtl8211e_config_init()
8
9 Signed-off-by: Michael Klein <michael@fossekall.de>
10 Reviewed-by: Andrew Lunn <andrew@lunn.ch>
11 Link: https://patch.msgid.link/20250504172916.243185-3-michael@fossekall.de
12 Signed-off-by: Paolo Abeni <pabeni@redhat.com>
13 ---
14 drivers/net/phy/realtek/realtek_main.c | 38 ++++++++++++++++----------
15 1 file changed, 23 insertions(+), 15 deletions(-)
16
17 --- a/drivers/net/phy/realtek/realtek_main.c
18 +++ b/drivers/net/phy/realtek/realtek_main.c
19 @@ -26,7 +26,9 @@
20 #define RTL821x_INSR 0x13
21
22 #define RTL821x_EXT_PAGE_SELECT 0x1e
23 +
24 #define RTL821x_PAGE_SELECT 0x1f
25 +#define RTL821x_SET_EXT_PAGE 0x07
26
27 #define RTL8211F_PHYCR1 0x18
28 #define RTL8211F_PHYCR2 0x19
29 @@ -69,9 +71,12 @@
30 #define RTL8211F_ALDPS_ENABLE BIT(2)
31 #define RTL8211F_ALDPS_XTAL_OFF BIT(12)
32
33 +#define RTL8211E_RGMII_EXT_PAGE 0xa4
34 +#define RTL8211E_RGMII_DELAY 0x1c
35 #define RTL8211E_CTRL_DELAY BIT(13)
36 #define RTL8211E_TX_DELAY BIT(12)
37 #define RTL8211E_RX_DELAY BIT(11)
38 +#define RTL8211E_DELAY_MASK GENMASK(13, 11)
39
40 #define RTL8201F_ISR 0x1e
41 #define RTL8201F_ISR_ANERR BIT(15)
42 @@ -151,6 +156,21 @@ static int rtl821x_write_page(struct phy
43 return __phy_write(phydev, RTL821x_PAGE_SELECT, page);
44 }
45
46 +static int rtl821x_modify_ext_page(struct phy_device *phydev, u16 ext_page,
47 + u32 regnum, u16 mask, u16 set)
48 +{
49 + int oldpage, ret = 0;
50 +
51 + oldpage = phy_select_page(phydev, RTL821x_SET_EXT_PAGE);
52 + if (oldpage >= 0) {
53 + ret = __phy_write(phydev, RTL821x_EXT_PAGE_SELECT, ext_page);
54 + if (ret == 0)
55 + ret = __phy_modify(phydev, regnum, mask, set);
56 + }
57 +
58 + return phy_restore_page(phydev, oldpage, ret);
59 +}
60 +
61 static int rtl821x_probe(struct phy_device *phydev)
62 {
63 struct device *dev = &phydev->mdio.dev;
64 @@ -670,7 +690,6 @@ static int rtl8211f_led_hw_control_set(s
65
66 static int rtl8211e_config_init(struct phy_device *phydev)
67 {
68 - int ret = 0, oldpage;
69 u16 val;
70
71 /* enable TX/RX delay for rgmii-* modes, and disable them for rgmii. */
72 @@ -700,20 +719,9 @@ static int rtl8211e_config_init(struct p
73 * 12 = RX Delay, 11 = TX Delay
74 * 10:0 = Test && debug settings reserved by realtek
75 */
76 - oldpage = phy_select_page(phydev, 0x7);
77 - if (oldpage < 0)
78 - goto err_restore_page;
79 -
80 - ret = __phy_write(phydev, RTL821x_EXT_PAGE_SELECT, 0xa4);
81 - if (ret)
82 - goto err_restore_page;
83 -
84 - ret = __phy_modify(phydev, 0x1c, RTL8211E_CTRL_DELAY
85 - | RTL8211E_TX_DELAY | RTL8211E_RX_DELAY,
86 - val);
87 -
88 -err_restore_page:
89 - return phy_restore_page(phydev, oldpage, ret);
90 + return rtl821x_modify_ext_page(phydev, RTL8211E_RGMII_EXT_PAGE,
91 + RTL8211E_RGMII_DELAY,
92 + RTL8211E_DELAY_MASK, val);
93 }
94
95 static int rtl8211b_suspend(struct phy_device *phydev)