83ea4928e9c31b4b5f71e7b357eb59d4e405f784
[openwrt/staging/stintel.git] /
1 From f63f21e82ecafd288b100ea161247820bf1e92c4 Mon Sep 17 00:00:00 2001
2 From: Aleksander Jan Bajkowski <olek2@wp.pl>
3 Date: Mon, 25 Aug 2025 23:09:49 +0200
4 Subject: [PATCH] net: phy: realtek: support for TRIGGER_NETDEV_LINK on
5 RTL8211E and RTL8211F
6
7 This patch adds support for the TRIGGER_NETDEV_LINK trigger. It activates
8 the LED when a link is established, regardless of the speed.
9
10 Tested on Orange Pi PC2 with RTL8211E PHY.
11
12 Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
13 Reviewed-by: Andrew Lunn <andrew@lunn.ch>
14 Link: https://patch.msgid.link/20250825211059.143231-1-olek2@wp.pl
15 Signed-off-by: Jakub Kicinski <kuba@kernel.org>
16 ---
17 drivers/net/phy/realtek/realtek_main.c | 39 +++++++++++++++++++++-----
18 1 file changed, 32 insertions(+), 7 deletions(-)
19
20 --- a/drivers/net/phy/realtek/realtek_main.c
21 +++ b/drivers/net/phy/realtek/realtek_main.c
22 @@ -648,7 +648,8 @@ static int rtl821x_resume(struct phy_dev
23 static int rtl8211x_led_hw_is_supported(struct phy_device *phydev, u8 index,
24 unsigned long rules)
25 {
26 - const unsigned long mask = BIT(TRIGGER_NETDEV_LINK_10) |
27 + const unsigned long mask = BIT(TRIGGER_NETDEV_LINK) |
28 + BIT(TRIGGER_NETDEV_LINK_10) |
29 BIT(TRIGGER_NETDEV_LINK_100) |
30 BIT(TRIGGER_NETDEV_LINK_1000) |
31 BIT(TRIGGER_NETDEV_RX) |
32 @@ -706,6 +707,12 @@ static int rtl8211f_led_hw_control_get(s
33 if (val & RTL8211F_LEDCR_LINK_1000)
34 __set_bit(TRIGGER_NETDEV_LINK_1000, rules);
35
36 + if ((val & RTL8211F_LEDCR_LINK_10) &&
37 + (val & RTL8211F_LEDCR_LINK_100) &&
38 + (val & RTL8211F_LEDCR_LINK_1000)) {
39 + __set_bit(TRIGGER_NETDEV_LINK, rules);
40 + }
41 +
42 if (val & RTL8211F_LEDCR_ACT_TXRX) {
43 __set_bit(TRIGGER_NETDEV_RX, rules);
44 __set_bit(TRIGGER_NETDEV_TX, rules);
45 @@ -723,14 +730,20 @@ static int rtl8211f_led_hw_control_set(s
46 if (index >= RTL8211x_LED_COUNT)
47 return -EINVAL;
48
49 - if (test_bit(TRIGGER_NETDEV_LINK_10, &rules))
50 + if (test_bit(TRIGGER_NETDEV_LINK, &rules) ||
51 + test_bit(TRIGGER_NETDEV_LINK_10, &rules)) {
52 reg |= RTL8211F_LEDCR_LINK_10;
53 + }
54
55 - if (test_bit(TRIGGER_NETDEV_LINK_100, &rules))
56 + if (test_bit(TRIGGER_NETDEV_LINK, &rules) ||
57 + test_bit(TRIGGER_NETDEV_LINK_100, &rules)) {
58 reg |= RTL8211F_LEDCR_LINK_100;
59 + }
60
61 - if (test_bit(TRIGGER_NETDEV_LINK_1000, &rules))
62 + if (test_bit(TRIGGER_NETDEV_LINK, &rules) ||
63 + test_bit(TRIGGER_NETDEV_LINK_1000, &rules)) {
64 reg |= RTL8211F_LEDCR_LINK_1000;
65 + }
66
67 if (test_bit(TRIGGER_NETDEV_RX, &rules) ||
68 test_bit(TRIGGER_NETDEV_TX, &rules)) {
69 @@ -778,6 +791,12 @@ static int rtl8211e_led_hw_control_get(s
70 if (cr2 & RTL8211E_LEDCR2_LINK_1000)
71 __set_bit(TRIGGER_NETDEV_LINK_1000, rules);
72
73 + if ((cr2 & RTL8211E_LEDCR2_LINK_10) &&
74 + (cr2 & RTL8211E_LEDCR2_LINK_100) &&
75 + (cr2 & RTL8211E_LEDCR2_LINK_1000)) {
76 + __set_bit(TRIGGER_NETDEV_LINK, rules);
77 + }
78 +
79 return ret;
80 }
81
82 @@ -805,14 +824,20 @@ static int rtl8211e_led_hw_control_set(s
83 if (ret < 0)
84 return ret;
85
86 - if (test_bit(TRIGGER_NETDEV_LINK_10, &rules))
87 + if (test_bit(TRIGGER_NETDEV_LINK, &rules) ||
88 + test_bit(TRIGGER_NETDEV_LINK_10, &rules)) {
89 cr2 |= RTL8211E_LEDCR2_LINK_10;
90 + }
91
92 - if (test_bit(TRIGGER_NETDEV_LINK_100, &rules))
93 + if (test_bit(TRIGGER_NETDEV_LINK, &rules) ||
94 + test_bit(TRIGGER_NETDEV_LINK_100, &rules)) {
95 cr2 |= RTL8211E_LEDCR2_LINK_100;
96 + }
97
98 - if (test_bit(TRIGGER_NETDEV_LINK_1000, &rules))
99 + if (test_bit(TRIGGER_NETDEV_LINK, &rules) ||
100 + test_bit(TRIGGER_NETDEV_LINK_1000, &rules)) {
101 cr2 |= RTL8211E_LEDCR2_LINK_1000;
102 + }
103
104 cr2 <<= RTL8211E_LEDCR2_SHIFT * index;
105 ret = rtl821x_modify_ext_page(phydev, RTL8211E_LEDCR_EXT_PAGE,